我有一张包含640k记录的表格。有一个名为COUNTRY_CD
的列。它始终设置为USA
。 COUNTRY_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秒以下的查询。
答案 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 的访问速度比基于索引访问表更快,如果它尚未加载到内存中。