我有以下类型的SQL查询:
SELECT * FROM data_table WHERE col2 >= x AND col2 < x+y
data_table上存在index_1(col1,col2,col3),而第一列到第三列保存大于零的整数值,而不允许使用空值。由于MySQL中索引的每个左前缀都是索引,我的第一个approch是修改查询,希望MySQL将使用index_1并且查询速度加快。修改后的查询如下所示:
SELECT * FROM data_table WHERE col2 >= x AND col2 < x+y OR col1 >0
我的想法是,当我添加一些总是正确但不会改变结果的东西时,MySQL会使用index_1的左前缀(col1,col2),但是快速浏览一下EXPLAIN就不幸了。
有谁知道如何修改查询以便使用index_1?或者这是不可能的?
您的信息:data_table非常大,由于创建时间很长,因此使用col2创建新索引不是一个合适的选项。
答案 0 :(得分:1)
抱歉
我回答的时间太晚了,我在一年之前就读到这个,现在我发现这本书涵盖了这本书,你不应该使用*,因为你的索引没有覆盖它,你应该像SELECT一样定义列col1,col2,col3等...或重写查询到这样的事情:
SELECT * FROM data_table JOIN (SELECT col1 FROM data_table WHERE col2>=x AND col2<x+y) AS table ON (table.col1=data_table.col1)
,这里的子查询将使用索引,因此它会比你的查询更快......
答案 1 :(得分:0)
col1 > 0
毫无意义:它意味着“每一行”。优化程序使用的统计信息将显示此信息,因此将忽略或低效使用索引(扫描,未搜索)
思路:
另外,检查您是否需要当前索引。除非它用于其他查询,否则请将其替换为更有用的内容