首頁  >  問答  >  主體

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 天前680

全部回覆(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
  • 取消回覆