0

我有以下类型的 SQL 查询:

SELECT * FROM data_table WHERE col2 >= x AND col2 < x+y

data_table 上有一个 index_1(col1, col2, col3) ,而第一到第三列保存大于零的整数值,而不允许使用空值。由于 MySQL 中索引的每个左前缀都是索引,我的第一个方法是修改查询,希望 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 创建新索引不是一个合适的选择。

4

2 回答 2

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),在子查询中将使用索引,因此它会比您的查询更快...

于 2012-05-23T21:07:15.037 回答
0

col1 > 0是没有意义的:它的意思是“每一行”。优化器使用的统计数据将显示这一点,因此索引被忽略或使用效率低下(扫描,未搜索)

想法:

  • 如果您使用的是 col2,为什么不在 col2 上创建索引?
  • 将索引更改为 (col2, col1, col3)

此外,检查您是否需要当前索引。除非它用于其他查询,否则将其替换为更有用的东西

于 2012-05-22T11:57:08.450 回答