【发布时间】:2018-01-05 13:55:55
【问题描述】:
我有一张几乎有 10 个磨坊的桌子。行,它包含 reference (varchar20) 和 date_created(datetime) 列。该表在这些列上有两个索引。
通过检查 slow_queries 日志,我们检测到一个非常非常慢且经常使用的查询:
...WHERE reference LIKE '%SOME_TEXT%' ORDER BY date_created
现在必须提高查询时间。
我读到最好的方法是在这些列上建立多个索引,如下所示:
create index ref_date on my_table (reference, date_created)
但我想知道是否有更好的方法来创建此索引或设置特定的索引类型以使其完美适用于上述查询。
非常感谢你们!
【问题讨论】:
-
在开始时使用通配符(
LIKE '%SOME_TEXT%')表示该列上的索引无法使用,因此添加新索引不会提高性能。如果可以删除它前导通配符('SOME_TEXT%'),您现有的索引可以使用,您也不需要额外的。提高两端通配符性能的唯一方法是切换到全文索引,这增加了一层复杂性,可能会也可能不会提高性能,具体取决于您的特定数据和搜索。 -
我们可能会删除该起始通配符。我将在星期一进行一些测试,以检查是否使用当前表状态,如果没有该通配符,时间会减少。谢谢!
-
删除左通配符将允许使用现有索引,这将大大提高性能。不像能够删除两个通配符,但仍然非常重要。
-
使用尾随通配符,将不使用索引中的第二列。不过,在不使用尾随通配符的情况下保留复合索引是可以的。