我在表格中有一个“名称”列,并且至少有1000万条记录。我在这个名称列上添加了一个索引。现在,对于第一次初始的几次搜索,返回单个答案(无论名称是否存在)需要超过10秒钟,但突然间,它在不到0.1秒的时间内给出了结果。我错过了什么吗?我知道MySQL维护了最近查询的缓存,但我正在尝试的查询非常随机...有关为什么会这样做的任何想法?
答案 0 :(得分:4)
您的查询只是加热索引缓存。这与查询缓存无关。由于索引基数值未存储在表文件中,因此InnoDB索引特别需要一些热门进行预热。初始查询将使用my.cnf中由innodb_buffer_pool_size指定的值定义它们遇到的索引数据来弹出InnoDB缓冲池。虽然MyISAM表不太重要,但值key_buffer_size可以类似地调整。
MySQL的InnoDB性能调整章节提供了一个很好的切入点,可以弄清楚发生了什么: http://dev.mysql.com/doc/refman/5.0/en/innodb-tuning.html
答案 1 :(得分:0)
索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相关行。表越大,成本越高。如果表中有相关列的索引,MySQL可以快速确定要在数据文件中间寻找的位置,而无需查看所有数据。如果一个表有1,000行,这比按顺序读取快至少100倍。如果您需要访问大多数行,则按顺序读取会更快,因为这会最大限度地减少磁盘搜索。