这几乎让我疯了
我执行以下查询:
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查询缓存,所以每次运行查询时,我都会得到相同的精确值(当然它在毫秒级别上有所不同,但这可以忽略不计)
更新:表格是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秒)
答案 0 :(得分:0)
您如何测试查询速度?我怀疑这不是一个合适的方式。查询表越多,MySQL就越有可能在表上进行一些激烈的预取,这意味着表上的进一步查询会更快,尽管它们需要扫描更多数据。之所以如此是因为MySQL不必从磁盘加载页面,因为它已经预先在内存中加载了它们。
正如其他人所说,查询缓存也可能会破坏测试结果,特别是如果它们意味着连续多次重新运行查询以获得“平均”运行时。
答案 1 :(得分:0)
将SQL_NO_CACHE添加到您的查询中,看看它是否是欺骗您的缓存。
要了解花时间,请尝试使用PROFILING,如下所示:
mysql> SET profiling = 1;
mysql> Your select goes here;
mysql> SHOW PROFILES;
答案 2 :(得分:0)
另外,尝试使用更简单的查询:
SELECT * FROM photo_person WHERE `photo_person`.`person_id` ='1'
我不知道MySQL是否在优化您的查询,但从逻辑上讲,您和这是相同的 - 除了您使用子查询 - 始终在可能的情况下避免子查询