【问题标题】:MySQL doesn't use index when range is too large范围太大时 MySQL 不使用索引
【发布时间】:2014-05-23 09:02:34
【问题描述】:

我正在处理 2 个查询:

EXPLAIN SELECT ecpm AS cpm, date_added, cpid, sales
FROM table1
WHERE date_added >=20130501000000
AND date_added <20140531235959

EXPLAIN SELECT ecpm AS cpm, date_added, cpid, sales
FROM table1
WHERE date_added >=20140501000000 
AND date_added <20140531235959

第一个查询使用 1079470 行,第二个查询使用 14942 行。

我的问题:第一个查询不使用索引:

1   SIMPLE  table1  ALL PRIMARY,date_added  NULL    NULL    NULL    1079470 Using where

而第二个是:

1   SIMPLE  table1  range   PRIMARY,date_added  date_added  8   NULL    14942   Using where

无论我的范围是否很大,我应该使用什么参数才能使用 INDEX?

谢谢,

【问题讨论】:

    标签: mysql indexing range


    【解决方案1】:

    很可能 MySQL 已经确定避免更大范围的索引更有效,因为它最终会扫描整个表(基于优化器修剪设置)。

    我建议阅读 MySQL 查询优化:Controlling the Query Optimizer。更具体地说,看看optimizer prune levels

    以下是有关EXPLAIN 查询的更多信息:Optimizing queries with EXPLAIN

    【讨论】:

    • 即使修改优化器设置,也不会改变行为:mysql> SET optimizer_switch='index_merge=off,index_merge_union=off,index_merge_sort_union=off';
    猜你喜欢
    • 2018-05-24
    • 1970-01-01
    • 2013-08-20
    • 2022-01-05
    • 2012-04-06
    • 2014-01-12
    • 2019-05-29
    • 1970-01-01
    • 2016-01-07
    相关资源
    最近更新 更多