这都快把我逼疯了
我执行以下查询:
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
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 ;以下是性能分析的结果
+----------+------------+-----------------------------+
| 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') |
+----------+------------+-----------------------------+现在,由于数量是相同的,所以一定是缓存:(因此,缓存明显地在一定数量的记录或字节中起作用
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秒)
发布于 2011-11-22 18:16:58
你是如何测试查询速度的?我怀疑这不是一种合适的方式。查询表的次数越多,MySQL就越有可能对表执行一些激进的预取操作,这意味着对表的进一步查询会更快,尽管它们需要扫描更多的数据。这样做的原因是因为MySQL不必从磁盘加载页面,因为它已经在内存中预取了页面。
正如其他人所说的那样,查询缓存也会弄乱您的测试结果,特别是如果它们意味着连续多次重新运行查询以获得“平均”运行时间。
发布于 2011-11-22 18:25:06
将SQL_NO_CACHE添加到您的查询中,看看是否是缓存欺骗了您。
要查看耗费时间的原因,请尝试使用PROFILING,如下所示:
mysql> SET profiling = 1;
mysql> Your select goes here;
mysql> SHOW PROFILES;发布于 2011-11-22 18:25:10
另外,尝试使用更简单的查询:
SELECT * FROM photo_person WHERE `photo_person`.`person_id` ='1'我不知道MySQL是否优化了您的查询,但从逻辑上讲,您的和是等效的-除了您使用子查询-总是尽可能避免子查询
https://stackoverflow.com/questions/8225126
复制相似问题