更多记录需要更少的时间

时间:2011-11-22 10:13:52

标签: mysql

这几乎让我疯了

我执行以下查询:

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秒)

3 个答案:

答案 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是否在优化您的查询,但从逻辑上讲,您和这是相同的 - 除了您使用子查询 - 始终在可能的情况下避免子查询