首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >记录越多,所需时间越短

问记录越多,所需时间越短
EN

Stack Overflow用户
提问于 2011-11-22 18:13:52
回答 3查看 100关注 0票数 0

这都快把我逼疯了

我执行以下查询:

代码语言:javascript
复制
SELECT * FROM `photo_person` WHERE photo_person.photo_id IN (SELECT photo_id FROM photo_person WHERE `photo_person`.`person_id` ='1')

当我改变id时,我得到不同的处理时间。尽管它们都是相同的查询和表。通过更改person_id,我将获得以下内容:

-- person_id=1 (共3个,查询耗时0.4523秒)

-- person_id=2 (总共99,查询耗时0.1340秒)

-- person_id=3 (共470,查询耗时0.0194秒)

-- person_id=4 (共1,869,查询耗时0.0024秒)

我不明白为什么随着记录/结果数量的增加,查询时间会更短。表的结构非常简单

更新:我已经禁用了mysql查询缓存,所以每次我运行查询时,我都会得到相同的值(当然,它在毫秒级别上是不同的,但这是可以忽略的)

更新: table为MyISAM

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS `photo_person` (
`entry_id` int(11) NOT NULL AUTO_INCREMENT,
`photo_id` int(11) NOT NULL DEFAULT '0',
`person_id` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`entry_id`),
UNIQUE KEY `PhotoID` (`photo_id`,`person_id`),
KEY `photo_id` (`photo_id`),
KEY `person_id` (`person_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=182072 ;

以下是性能分析的结果

代码语言:javascript
复制
+----------+------------+-----------------------------+
| Query_ID | Duration   |Query                        |
+----------+------------+-----------------------------+
|        1 | 0.45541200 | SELECT ...`person_id` ='1') |
|        2 | 0.44833700 | SELECT ...`person_id` ='2') |
|        3 | 0.45587800 | SELECT ...`person_id` ='3') |
|        4 | 0.45074900 | SELECT ...`person_id` ='4') |
+----------+------------+-----------------------------+

现在,由于数量是相同的,所以一定是缓存:(因此,缓存明显地在一定数量的记录或字节中起作用

代码语言:javascript
复制
mysql> SHOW VARIABLES LIKE "%cac%";
+------------------------------+------------+
| Variable_name                | Value      |
+------------------------------+------------+
| binlog_cache_size            | 32768      |
| have_query_cache             | YES        |
| key_cache_age_threshold      | 300        |
| key_cache_block_size         | 1024       |
| key_cache_division_limit     | 100        |
| max_binlog_cache_size        | 4294963200 |
| query_cache_limit            | 1024       |
| query_cache_min_res_unit     | 4096       |
| query_cache_size             | 1024       |
| query_cache_type             | ON         |
| query_cache_wlock_invalidate | OFF        |
| table_definition_cache       | 256        |
| table_open_cache             | 64         |
| thread_cache_size            | 8          |
+------------------------------+------------+

集合中的14行(0.00秒)

EN

回答 3

Stack Overflow用户

发布于 2011-11-22 18:16:58

你是如何测试查询速度的?我怀疑这不是一种合适的方式。查询表的次数越多,MySQL就越有可能对表执行一些激进的预取操作,这意味着对表的进一步查询会更快,尽管它们需要扫描更多的数据。这样做的原因是因为MySQL不必从磁盘加载页面,因为它已经在内存中预取了页面。

正如其他人所说的那样,查询缓存也会弄乱您的测试结果,特别是如果它们意味着连续多次重新运行查询以获得“平均”运行时间。

票数 0
EN

Stack Overflow用户

发布于 2011-11-22 18:25:06

将SQL_NO_CACHE添加到您的查询中,看看是否是缓存欺骗了您。

要查看耗费时间的原因,请尝试使用PROFILING,如下所示:

代码语言:javascript
复制
mysql> SET profiling = 1;
mysql> Your select goes here;
mysql> SHOW PROFILES;
票数 0
EN

Stack Overflow用户

发布于 2011-11-22 18:25:10

另外,尝试使用更简单的查询:

代码语言:javascript
复制
SELECT * FROM photo_person WHERE `photo_person`.`person_id` ='1'

我不知道MySQL是否优化了您的查询,但从逻辑上讲,您的和是等效的-除了您使用子查询-总是尽可能避免子查询

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8225126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档