不命中sql
select account from user where id not in (1,2,3);
複製代碼
命中數據庫
select account from user where id in (4,5,6);
複製代碼
不命中工具
select account from user where name like '%lufei'
複製代碼
命中優化
select account from user where name like 'lu%fei%'
複製代碼
建議能夠考慮使用 Lucene 等全文索引工具來代替頻繁的模糊查詢。spa
對非惟一的字段,例如「性別」這種大量重複的重複值的字段,增長索引也沒有什麼意義。能夠採用惟一帳號等字段。code
越小越簡單的數據類型一般在磁盤、內存中佔用少,處理起來更快,例如整型數據比字符處理開銷小,由於字符串的比較更復雜,處理很是耗時。cdn
索引字段應該制定列爲NOT NULL 。含有空值得列很難進行查詢優化,由於他們使得索引、索引的統計信息以及比較運算增長複雜,應該用0或者特殊值、空字符代替。索引
索引列不能參與計算,儘可能保持列「乾淨」。好比,FROM_UNIXTIME(create_time) = '2016-06-06' 就不能命中索引。 不命中內存
select account from user where FROM_UNIXTIME(create_time) = CURDATE();
複製代碼
命中開發
select account from user where create_time = FROM_UNIXTIME(CURDATE());
複製代碼
表與錶鏈接用於多表聯合查詢的約束條件的字段應當創建索引,而且進行 join 的字段兩表的字段類型要相同,否則也不會命中索引。
不命中
select account from user where phone = 1341111111
複製代碼
命中
select account from user where phone = '1341111111'
複製代碼
select account from user where phone = '1341111111' limit 1
複製代碼
能夠提升效率,讓數據庫中止遊標移動。
最左前綴匹配原則。MySQL會一直向右匹配直到遇到範圍查詢(>,<,BETWEEN,LIKE)就中止匹配。 若有索引(a, b, c, d),查詢條件a = 1 and b = 2 and c > 3 and d = 4,則會在每一個節點依次命中a、b、c,而沒法命中d。(很簡單:索引命中只能是相等的狀況,不能是範圍匹配)