mysql - 为什么where条件中or加索引不起作用?
阿神
阿神 2017-04-17 14:58:32
0
4
626

CREATE TABLEtest(
idint(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
creatorvarchar(128) NOT NULL DEFAULT '0' COMMENT '创建人',
gmt_createtimestamp NULL DEFAULT NULL COMMENT '创建时间',
modifiervarchar(128) DEFAULT '0' COMMENT '修改人',
gmt_modifiedtimestamp NULL DEFAULT NULL COMMENT '修改时间',
titlevarchar(64) DEFAULT NULL COMMENT '工单标题',
categoryvarchar(32) DEFAULT NULL COMMENT '工单类别',
subjectvarchar(32) DEFAULT NULL COMMENT '工单类型',
demandervarchar(30) DEFAULT NULL COMMENT '需求方',
is_atomicchar(1) DEFAULT 'y' COMMENT '是否原子工单',
atomic_idint(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'

阿神
阿神

闭关修行中......

모든 응답 (4)
迷茫

一,数据量太少,制定执行计划时发现全表更快,可以往表里填几百万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

    Peter_Zhu

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

      小葫芦

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

        小葫芦

        赞成@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
          최신 다운로드
          더>
          웹 효과
          웹사이트 소스 코드
          웹사이트 자료
          프론트엔드 템플릿
          회사 소개 부인 성명 Sitemap
          PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!