【问题标题】:Mysql - "Select like" not using indexMysql - “选择喜欢”不使用索引
【发布时间】:2012-08-15 07:59:11
【问题描述】:

我一直在使用 MySQL(5.5.24,WinXP)上的索引,但我找不到在使用 LIKE 时服务器不使用一个索引的原因。

例子是这样的:

我已经创建了一个测试表:

create table testTable (
  id varchar(50) primary key,
  text1 varchar(50) not null,
  startDate varchar(50) not null
) ENGINE = innodb;

然后,我向startDate 添加了一个索引。 (请不要问为什么该列是文本而不是日期时间。这只是一个简单的测试):

create index jeje on testTable(startdate);
analyze table testTable;

在那之后,我添加了近 200,000 行,其中 startDate 有 3 个可能的值。 (每一个出现三分之一......接近70,000次)

所以,如果我像这样运行 EXPLAIN 命令:

explain select * from testTable use index (jeje) where startDate = 'aaaaaaaaa';

答案如下:

id = 1
select_type = SIMPLE
type = ref
possible_keys = jeje
key = jeje
rows = 88412
extra = Using where

所以,使用了key,并且行数接近200,000/3,所以一切正常。

问题是,如果我将查询更改为:(只需将 '=' 更改为 'LIKE'):

explain select * from testTable use index(jeje) where startDate LIKE 'aaaaaaaaa';

在这种情况下,答案是:

id = 1
select_type = SIMPLE
type = ALL
possible_keys = jeje
key = null
rows = 176824
extra = Using where

因此,现在没有使用索引(键为空,并且行接近整个表......正如 type=all 所暗示的那样)。

MySQL 文档说 LIKE DOES 使用索引。

那么,我在这里没有看到什么?问题出在哪里?

感谢您的帮助。

【问题讨论】:

    标签: mysql indexing explain


    【解决方案1】:

    如果索引导致访问超过 30% 的表行,MySql 可以忽略索引。 你可以试试 FORCE INDEX [index_name],无论如何它都会使用索引。

    sysvar_max_seeks_for_key 的值也会影响索引是否被使用:

    在 SO 上搜索类似请求。

    【讨论】:

    • 感谢 Ubik 的回答。基于此,我将表数据更改为接近 300k 行,startDate 列上有 5 个可能的值(每个 20%)。
    • 您的回答无助于解决问题,但确实帮助我以不同的方式思考。到目前为止,我还没有一个“解决方案”,但有一个关于什么是其根源的想法。看我自己的答案。感谢您的帮助!。
    【解决方案2】:

    基于Ubik comment,以及数据变化,我发现: 在这些情况下使用的索引 IS

    - explain select * from testTable force index jeje where startDate like 'aaaaaaadsfadsfadsfasafsafsasfsadsfa%';
    - explain select * from testTable force index jeje where startDate like 'aaaaaaadsfadsfadsfasafsafsasfsadsfa%';
    - explain select * from testTable force index jeje where startDate like 'aaa';
    

    但是当我使用这个查询时,索引NOT被使用:

    - explain select * from testTable force index jeje where startDate like 'aaaaaaaaa';
    

    基于 startDate 列中所有值都具有相同长度(9 个字符)的事实,当我使用 LIKE 命令和 9 个字符常量使用查询时,PERHAPS MySQL因为某些性能算法而倾向于不使用的原因,并去表。

    我担心的是看看我在最初的测试中是否犯了某种错误,但现在我认为索引和测试是正确的,并且 MySQL 在某些情况下决定不使用索引......而我将对此进行转发。

    对我来说,这是一项封闭的任务。 如果有人想在线程中添加一些内容,欢迎您。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      相关资源
      最近更新 更多