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

Mysql 如何找到sql表的最佳索引?,mysql,sql,Mysql,Sql,我有一个日志表,它有数百万条记录。我想提高sql查询速度,但不知道如何生成最佳索引组。如何找到sql表的最佳索引 目前我正在使用 索引:我的测试索引 定义: B型树 唯一编号 A列 F B D C 下面是我对日志表的所有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,10

我有一个日志表,它有数百万条记录。我想提高sql查询速度,但不知道如何生成最佳索引组。如何找到sql表的最佳索引

目前我正在使用

索引:我的测试索引

定义: B型树

唯一编号

A列 F B D C

下面是我对日志表的所有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;
$sql=“选择*
从日志
其中,columnA=1和(columnB=6或columnB=4或columnB=7),columnC=…按columnD desc LIMIT 0100排序;
$sql=“选择*
从日志

其中columnA=1和(columnB=6或columnB=4)和columnE=。。。和((date(columnD))>=…和(date(columnD))=…和(date(columnD))我建议的索引是

  • 可乐,可乐,可乐
  • 可乐,可乐,可乐
  • 可乐,可乐,可乐
  • 可乐,可乐,可乐
  • 还有几点:

    • 您不需要在日期上有索引,因为每一行都有不同的值,添加索引并不重要
    • 由于所有查询都有相同的检查,所以顺序并不重要
    • 此外,如果执行的频率较低,您可以删除一个或两个索引,因为(colA,colB)上总会有一些索引
    • 如果基数(可能值)非常小,则可以删除列上的索引。例如,可能值为1/0的有效列不需要索引。如果该值与30%以上的键值匹配,mysql更愿意进行表扫描

    如果说所有4个索引都是必需的,那就错了。但这是您最需要的。通过评估上述其他条件,您可以得到较少的索引。

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

    一般来说,如果where子句中的已知列值没有显著限制相关行数,则该列上的索引对于此查询毫无价值。例如,您的查询表明索引con-colA是一个不错的选择。但是,当您的colA中只有很少的不同值时,这不会给您带来任何好处

    (日期)函数的索引(“基于函数的索引”)在某些RDBMS中是可能的,但它们实际上非常罕见。如果您觉得需要更多基于函数的索引,那么您的总体设计可能有问题

    “or”子句的索引是否有回报很难预先判断。这完全取决于查询优化器从查询中得到的结果。一般来说,“or”子句很少见,如果您发现自己编写了许多包含“or”的查询子句中,您的总体设计可能有问题。如果您确实需要索引或ed列,则位图索引可能会有所帮助,但它们会带来自身的问题

    索引通常对“排序依据”没有帮助

    一般来说,索引的设计方式应使其显著缩小查询的搜索空间。无需将其缩小到一个且唯一匹配的行。如果减少到总行数的10%,则索引将获得回报


    索引总是会降低插入和更新的速度。除了主键和唯一键所需的索引之外,一开始就不使用任何索引是合理的做法。

    阅读:感谢您的帮助。我将创建所有4个索引并检查查询执行时间,并删除其中一些wrt数据。索引是否有真正的顺序?我的意思是为什么不是A,B,E而是A,E,B?既然你已经有了A,B,C的索引,最好再加一个其他模式的索引。