2009-12-09 20 views
2

我在表中有一列“名称”,并且至少有1000万条记录。我在这个名称列上添加了一个索引。现在,对于最初的几次搜索,返回单个答案(无论名称是否存在)需要超过10秒的时间,但突然间,它在不到0.1秒的时间内给出结果。我错过了什么吗?我知道MySQL维护最近的查询的缓存,但我所尝试的查询是非常随机的...任何想法,为什么发生这种情况?使用MySQL观察到奇怪的事情......查询突然变得超快

+0

定义“相当随意” - 它很可能是你的查询有足够的非随机的,经过第一很少,很多你的结果集已被带入内存,所以查询会更快。 – lawrence 2009-12-09 01:07:23

+0

呃...非常随意的只是输入我想到的任何东西。对不起...除此之外,我没有真正使用正式的随机性测试... – Legend 2009-12-09 01:15:52

回答

4

您的查询简单地暖索引缓存。这与查询缓存无关。由于InnoDB索引的索引基数值不存储在表文件中,因此InnoDB索引尤其需要一些命中预热。初始查询将使用它们遇到的索引数据来突出InnoDB缓冲池,这些数据由my.cnf中的innodb_buffer_pool_size指定的值定义。虽然对于MyISAM表不重要,但key_buffer_size的值可以进行类似的调整。

MySQL的InnoDB的性能tunning本章提供了一个很好的切入点进入弄清楚是怎么回事: http://dev.mysql.com/doc/refman/5.0/en/innodb-tuning.html

0

索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相关行。表格越大,成本越高。如果表中有相关​​列的索引,MySQL可以快速确定在数据文件中间寻找的位置,而无需查看所有数据。如果一个表有1,000行,这比顺序读取至少快100倍。如果您需要访问大多数行,顺序读取会更快,因为这可以最大限度地减少磁盘搜索。

通过MySQL.com

+0

谢谢,但我的问题更多地了解添加索引后发生了什么。我知道索引是如何工作的,但我对行为的变化感到困惑。 – Legend 2009-12-09 01:06:16