最好保持索引列類型與要查詢的條件一直
select *from table where Guid=123
其中Guid為Marcher(50),結果用
explain select *from table where Guid=123
發現type為all,但是Guid 是唯一索引值,于是改變方法如下
explain select *from table where Guid=‘123’
此時索引正常使用
強制使用索引
explain select * from Table2 a inner join Table1 b on
a.guid=b.guid where a.name=''
| id | select_type | table | type | possible_keys
| 1 | SIMPLE | a | ref |GuidKey,NameIndex,name_city_age
| 1 | SIMPLE | b | ALL | GuidKey
發現其中b 表是全表查詢,顯然是無法接受,于是強制加上索引
explain select * from Table2 a inner join Table1 b FORCE INDEX(GuidKey) on a.guid=b.guid where a.name='';
| id | select_type | table | type | possible_keys
| 1 | SIMPLE | a | ref |GuidKey,NameIndex,name_city_age
| 1 | SIMPLE | b | ref | GuidKey
索引優化
- 建立多表(三個表或以上)關聯視圖時,如果是主表和副表都有的字段,盡量使用主表的字段(特別是主表的主鍵)
- 副表的字段(無論是普通字段還是主鍵、索引字段)作為查詢條件對查詢都沒有幫助,都需進行全表檢索
- 如果查詢一條數據的時候使用limit
- 在join表的時候 連接條件的字段類型,應當一致,并且將其索引
如果你的應用中使用到了很多表連接查詢,應該確認表與表連接字段已經建立了索引,并且兩個字段類型是一致的.
向我上面兩表連接的字段類型都是int類型,且已經加了索引.如果你要把DECIMAL(小數)類型字段和int(整形)類型的字段連接在一起,那么Mysql就無法使用它們的索引 - 建立主鍵索引 即id
為每一個表都建立主鍵索引 id,而且這個id還是 AUTO_INCREMENT 最好是INT類型 ,如果你有一張表name是唯一的,并且你給name這個字段設立為主鍵,這樣效率會減低,因為使用VARCHAR類型的主鍵低于INT類型.而且,在MySQL 數據引擎下,還有一些操作需要使用主鍵,在這些情況下,主鍵的性能和設置變得非常重要,比如:mysql的分表, 集群等 - 建立表的時候使用NOT NULL,而且盡量給表設定默認值
NULL 需要額外的空間,mysql的上的文檔是這么說的
如果你的表的字段是int 那么應該給默認值 DEFAULT 0 ,如果是varchar類型 DEFAULT ' '