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’
问题解答
回答1:一,数据量太少,制定执行计划时发现全表更快,可以往表里填几百万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
回答2:老生常谈了,直接引用一篇博文http://blog.csdn.net/hguisu/article/details/7106159
回答3:谢谢邀请。看看这篇文档mysql关于or的索引问题 希望对你有帮助
回答4:赞成@xiayongsheng的说法, 在线上找了一含几千万数据的表, explain了一下or查询
# id是主键, user_id是普通索引explain SELECT * from t WHERE id = 100000 or user_id = ’c7b6752c37b111e6a7d705b57e583e2e’;idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEtindex_mergePRIMARY,t_useridPRIMARY,t_userid4,123 2Using union(PRIMARY,t_userid); Using where
相关文章:
1. javascript - 如何将 windows 下编辑器中的 CRLF 替换为 LF?2. 请教,关于python字典,合并相同值的键的实现方法3. android - 京东移动端网页和其app加载的url所做的呈现不应该是完全一样的吗?4. javamail发送邮件是否跟所在的网络环境有关?5. css3中translate(-50%,-50%)对 transform-origin的奇葩影响?6. html5 - 在一个页面中 初始了两个swiper 不知道哪里错了 一直不对7. Windows系统能否利用Docker使用Ubuntu吗?Ubuntu能使用本机的显卡吗?8. javascript - 求解答:实例对象调用constructor,此时constructor内的this的指向?9. mysql5.7就没有官方性质的详细配置文件吗?求大神告知10. python的MySQLdb库中的executemany方法如何改变默认加上的单引号?

网公网安备