如何找到sql表的最佳索引?

时间:2015-11-19 15:18:22

标签: mysql sql

我有一张日志表,它有数百万条记录。我想提高我的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;

2 个答案:

答案 0 :(得分:1)

我建议的指数是

  1. colA,colB,colC
  2. colA,colE,colB
  3. colA,colF,colB
  4. colA,colB,colG
  5. 其他一些要点:

    • 您不需要日期索引,因为每一行都有不同的值,添加索引并不重要。
    • 由于您的所有查询都有相同的检查,因此订单无关紧要。
    • 此外,如果执行频率较低,您可以删除一个或两个索引,因为将会有一些索引(colA,colB)
    • 如果基数(可能的值)非常小,则可以删除列上的索引。例如,无法索引具有可能值1/0的is_valid列。如果值匹配超过30%的键值,则mysql更喜欢进行表扫描。

    说所有4个索引都是必要的。但那是你最需要的。通过评估上述其他条件,您可以使用较少的索引。

答案 1 :(得分:1)

这一切都取决于数据的分布。

通常,如果where子句中的已知列值不会显着限制所讨论的行数,则该列的索引对此查询毫无价值。您的查询,建议指数con colA将是一个不错的选择。但是当你在colA中只有很少的明显价值时,那么这不会给你买任何东西。

某些RDBMS中可能存在(日期)函数(&#34;基于函数的索引)的索引,但它们实际上非常罕见。如果您觉得需要更多基于功能的索引,那么您的整体设计可能会出现问题。

&#34;或&#34;的索引付款的条款很难说清楚。这完全取决于查询优化器从您的查询中得到什么。通常&#34;或&#34;条款很少见,如果您发现自己编写了许多包含&#34;或&#34;条款,您的整体设计可能有问题。如果你确实需要or-ed列的索引,那么bitmap-index可能会有所帮助,但它们都有自己的问题。

索引通常不会帮助&#34;按&#34;

排序

通常,设计索引的方式会使搜索范围大大缩小。没有必要将其缩小到唯一匹配的行。如果你得到总行数的10%,那么索引就会得到回报。

索引始终会降低插入和更新速度。除了主键和唯一键所需的索引外,这是一种合理的方法,可以从没有索引开始。