在查询中添加where子句与索引显着减慢

时间:2015-08-20 18:18:04

标签: mysql sql

我有一张包含640k记录的表格。有一个名为COUNTRY_CD的列。它始终设置为USACOUNTRY_CD列上有一个索引。

我运行了以下查询,耗时6秒

select sum(ga) from sales_data

执行以下查询,耗时40秒

Select sum(ga) from sales_data where country_cd='usa'

正如我所说,country_cd上有一个索引。为什么运行第二个查询需要这么多时间?

更新

我增加了innodb_buffer_pool_size。第一个查询现在在1秒内运行,第二个查询在6秒内运行。我还能做些什么。我真的需要他们进行1秒以下的查询。

1 个答案:

答案 0 :(得分:3)

虽然你的整体表现相当慢,但差异的原因可能是mysql使用索引的方式。

如果您运行的查询没有where - 子句,则mysql会执行全表扫描以汇总值。通常,mysql现在按照插入顺序从数据表读取,导致顺序磁盘i / o。(快速)

当您在索引列上使用where - 子句时,mysql将使用该索引。因此,它将开始处理索引 sequentialy 但是对于每个匹配,它将在实际数据表中查找ga值,然后导致随机磁盘i / O

这是一个很好的例子,顺序磁盘访问如何比使用索引(和随机磁盘访问)更快: https://www.percona.com/blog/2012/11/23/full-table-scan-vs-full-index-scan-performance/

如果每个数据行包含相同的值,那么当使用非常糟糕的索引时,该示例显示了相同的关系(慢6倍) -

该链接还概述,这仅在表不适合内存时才有意义(也许你的开发机器没有给mysql足够的内存?)

我刚读完那里的评论,大家讨论是否真的有顺序的磁盘可能。我无法确定这一点,但至少结果和与内存中操作相比的差异表明,FULL-TABLE 的访问速度比基于索引访问表更快,如果它尚未加载到内存中。