【问题标题】:How to find best index for sql table?如何找到 sql 表的最佳索引?
【发布时间】:2015-11-19 15:18:21
【问题描述】:

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

目前我正在使用;

索引:my_test_index

定义: 键入 BTREE

唯一编号

A 列 F 乙 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;

【问题讨论】:

标签: mysql sql


【解决方案1】:

我建议的索引是

  1. colA, colB, colC
  2. colA, colE, colB
  3. colA, colF, colB
  4. colA, colB, colG

补充几点:

  • 您不需要在日期上设置索引,因为每一行都有不同的值,并且添加索引并不重要。
  • 由于您的所有查询都进行了等效检查,因此顺序并不重要。
  • 此外,如果执行频率较低,您可以删除一个或两个索引,因为 (colA, colB) 上总会有一些索引
  • 如果基数(可能的值)非常小,您可以删除列上的索引。例如,可能值为 1/0 的 is_valid 列不需要被索引。如果 value 匹配超过 30% 的 key value,mysql 更喜欢做 table scan。

说需要所有 4 个索引是错误的。但这是你最需要的。通过评估上述其他条件,您可以拥有更少的索引。

【讨论】:

  • 感谢您的帮助。我将创建所有 4 个索引并检查查询执行时间,并将删除其中一些 wrt 数据。 2. 和 3. 索引是否具有真实顺序?我的意思是为什么不是 A,B,E 而是 A,E,B?
  • 由于您已经在 A,B,C 上建立了索引,因此最好再拥有一个其他模式的索引。
【解决方案2】:

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

一般来说,如果 where 子句中的已知列值不会显着限制所讨论的行数,则该列上的索引对于此查询毫无价值。您的查询,例如建议索引 con colA 将是一个不错的选择。但是当你在 colA 中只有很少的不同值时,这不会给你带来任何好处。

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

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

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

一般而言,设计索引的方式应使其显着缩小查询的搜索空间。无需将其缩小到唯一匹配的行。如果您降低到总行数的 10%,那么索引将获得回报。

索引总是会减慢插入和更新的速度。完全不使用索引是一种合理的方法,除了主键和唯一键所需的索引。

【讨论】:

    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 2017-09-20
    • 2011-05-03
    • 1970-01-01
    • 2014-09-19
    • 2016-06-28
    • 2010-09-08
    • 2018-05-05
    相关资源
    最近更新 更多