如何在使用order by select时优化这个SQL


select id, col1,col2,col3,seq 
from `table` 
order by seq asc

我已经在'seq'上创建了索引,但是我发现它在选择时不使用索引和使用文件排序,因为col1可能会保存一些大数据,所以我不想在这个表中创建覆盖索引,所以它有一些解决方案来优化这个sql或表或索引,谢谢,我的英语不好😂😂😂

SQL查询优化器显然估计了使用索引的成本,并得出结论,最好只是执行表扫描并对结果使用文件排序。

使用非覆盖索引有开销。它按排序顺序读取索引,但随后必须解引用主键以获得该行未覆盖的其他列。

通过类比,这就像阅读一本书,通过在后面的索引中按字母顺序查找每个单词,然后一次一个单词地翻到书的其他页。很费时间,但这是按关键词顺序阅读的一种方法。

也就是说,文件排序也有开销。查询引擎必须收集匹配的行,并手动对它们进行排序,可能会使用临时文件。如果行数很大,这样做的代价会很高。您没有以行数描述表的大小。

如果您正在测试的表有少量的行,优化器可能会认为它可以足够快地进行文件排序,因此没有必要通过索引读取行。

使用更大的表进行测试可能会得到与优化器不同的结果。

查询优化器在大多数情况下会做出正确的选择。但它并不是绝对正确的。如果您认为在这种情况下强迫它使用索引更好,那么您可以使用FORCE index提示使它相信表扫描的成本过高。然后,如果索引是可用的,它将优先选择索引。

select id, col1,col2,col3,seq 
from `table` FORCE INDEX(seq)
order by seq asc

最新更新