場景與環境
redhat6.5 + 64位元+ 12核心+ 16G
表數量600w
MySQL 5.0
問題描述了一個簡單
欄位是普通索引,varchar),由於拼裝sql的時候,沒有使用引號,導致出現大量慢查詢問題SQLselect count(*) total from member_phone where phone in(1521xxx541,15845xxx412)問題SQL和糾正過的寫法對比執行時間
mysql> select count(*) total from member_phone where phone in(1521xxx541,15845xxx412); +-------+ | total | +-------+ | 1 | +-------+ 1 row in set (2.76 sec) mysql> select count(*) total from member_phone where phone in('1521xxx541','15845xxx412'); +-------+ | total | +-------+ | 1 | +-------+ 1 row in set (0.01 sec) mysql> select count(*) total from member_phone where (phone='1521xxx541' or phone='15845xxx412'); +-------+ | total | +-------+ | 1 | +-------+ 1 row in set (0.00 sec)
總結
在三個類型的sql中,效率從高到低分別是or,in 添加了引號, in不加引號。在explain中看到不加引號時,顯示的用上了索引phone,type 變成了 index ,和全表掃描差不多了,只不過MySQL掃描時按索引的次序進行而不是行。
提醒
在where多個or,in中條件個數比較多,或者多個in 條件時,實際性能都比較差的。以上測試我個人僅在MySQL5.0測試,高版官方不知是否優化過。