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. 如何解決docker宿主機無法訪問容器中的服務?2. javascript - 如何使用nodejs 將.html 文件轉化成canvas3. angular.js - 輸入郵箱地址之后, 如何使其自動在末尾添加分號?4. javascript - html5的data屬性怎么指定一個function函數呢?5. python - Scrapy存在內存泄漏的問題。6. 在mac下出現了兩個docker環境7. docker-compose中volumes的問題8. java如何生成token?9. javascript - 后臺管理系統左側折疊導航欄數據較多,怎么樣直接通過搜索去定位到具體某一個菜單項位置,并展開當前菜單10. javascript - Web微信聊天輸入框解決方案
