Heim > Fragen und Antworten > Hauptteil
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'
迷茫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
高洛峰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 |