>  Q&A  >  본문

mysql - 为什么where条件中or加索引不起作用?

CREATE TABLE test (
id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
creator varchar(128) NOT NULL DEFAULT '0' COMMENT '创建人',
gmt_create timestamp NULL DEFAULT NULL COMMENT '创建时间',
modifier varchar(128) DEFAULT '0' COMMENT '修改人',
gmt_modified timestamp NULL DEFAULT NULL COMMENT '修改时间',
title varchar(64) DEFAULT NULL COMMENT '工单标题',
category varchar(32) DEFAULT NULL COMMENT '工单类别',
subject varchar(32) DEFAULT NULL COMMENT '工单类型',
demander varchar(30) DEFAULT NULL COMMENT '需求方',
is_atomic char(1) DEFAULT 'y' COMMENT '是否原子工单',
atomic_id int(11) DEFAULT NULL COMMENT '当前原子工单在列表中ID',
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=182431 DEFAULT CHARSET=utf8 COMMENT='测试表';

SHOW INDEX FROM test

ALTER TABLE test ADD INDEX test_title (title)

EXPLAIN SELECT * FROM test.test WHERE id = 100 or title = 'gg'

EXPLAIN SELECT * FROM test.test WHERE title = 'ggg'

阿神阿神2743일 전679

모든 응답(4)나는 대답할 것이다

  • 迷茫

    迷茫2017-04-17 15:00:32

    一,数据量太少,制定执行计划时发现全表更快,可以往表里填几百万id和tittle不一样的数据试试。
    二,确保mysql版本5.0以上,且查询优化器开启了index_merge_union=on, 也就是变量optimizer_switch里存在index_merge_union且为on

    补充一点:

    @mokeyjay 的说法不是很正确,且过时。可以看看以下文档。

    http://dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.html

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-17 15:00:32

    老生常谈了,直接引用一篇博文http://blog.csdn.net/hguisu/article/details/7106159

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-17 15:00:32

    谢谢邀请。看看这篇文档mysql关于or的索引问题 希望对你有帮助

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-17 15:00:32

    赞成@xiayongsheng的说法, 在线上找了一含几千万数据的表, explain了一下or查询

    # id是主键, user_id是普通索引
    explain SELECT * from t WHERE id = 100000 or user_id = 'c7b6752c37b111e6a7d705b57e583e2e';
    
    id select_type table type possible_keys key key_len ref rows Extra
    1 SIMPLE t index_merge PRIMARY,t_userid PRIMARY,t_userid 4,123 2 Using union(PRIMARY,t_userid); Using where

    회신하다
    0
  • 취소회신하다