我有一张日志表,它有数百万条记录。我想提高我的SQL查询速度,但我不知道如何生成最佳索引组或索引组。如何找到sql表的最佳索引?
目前我正在使用;
索引:my_test_index
定义: 输入BTREE
独特否
列A F 乙 d ç
这是我在日志表上的所有SQL查询;
$sql = "select *
from log
where columnA=1 and (columnB=6 or columnB=4 or columnB=7) and columnC= ... order by columnD desc LIMIT 0,100;
$sql = "select *
from log
where columnA=1 and (columnB=6 or columnB=4) and columnE= ... and ((date(columnD))>=... and (date(columnD))<=...) order by columnD desc";
$sql = "select *
from log
where columnA=1 and (columnB=6 or columnB=4 or columnB=7) and columnE= ... order by columnD desc ";
$sql = "select *
from log
where columnA=1 and (columnB=6 or columnB=4) and columnE= ... and ((date(columnD))>=... and (date(columnD))<=...) order by columnD desc";
$sql = "select *
from log
where columnA=1 and (columnB=6 or columnB=4 or columnB=7) and columnF= ... order by columnD desc LIMIT 0,100;
$sql = "select *
from log
where columnA=1 and (columnB=6 or columnB=4 or columnB=7) and columnG= ... order by columnD desc LIMIT 0,100;
答案 0 :(得分:1)
我建议的指数是
其他一些要点:
说所有4个索引都是必要的。但那是你最需要的。通过评估上述其他条件,您可以使用较少的索引。
答案 1 :(得分:1)
这一切都取决于数据的分布。
通常,如果where子句中的已知列值不会显着限制所讨论的行数,则该列的索引对此查询毫无价值。您的查询,建议指数con colA将是一个不错的选择。但是当你在colA中只有很少的明显价值时,那么这不会给你买任何东西。
某些RDBMS中可能存在(日期)函数(&#34;基于函数的索引)的索引,但它们实际上非常罕见。如果您觉得需要更多基于功能的索引,那么您的整体设计可能会出现问题。
&#34;或&#34;的索引付款的条款很难说清楚。这完全取决于查询优化器从您的查询中得到什么。通常&#34;或&#34;条款很少见,如果您发现自己编写了许多包含&#34;或&#34;条款,您的整体设计可能有问题。如果你确实需要or-ed列的索引,那么bitmap-index可能会有所帮助,但它们都有自己的问题。
索引通常不会帮助&#34;按&#34;
排序通常,设计索引的方式会使搜索范围大大缩小。没有必要将其缩小到唯一匹配的行。如果你得到总行数的10%,那么索引就会得到回报。
索引始终会降低插入和更新速度。除了主键和唯一键所需的索引外,这是一种合理的方法,可以从没有索引开始。