left join時可能會導致mysql不走索引的一些原因:
1.關聯兩張表字符集不一樣會導致mysql不走索引;
2.select查詢字段太多會導致不走索引;
聚族索引
索引的主要目的是爲了加快查詢的速度,索引一般使用b-tree結構實現,其索引列信息位於葉子節點上
且索引列只包含整列數據的位置,但並不包含此索引列相關的數據。聚族索引與其他索引不同,在他的
索引列上包含了此列的完整數據信息,因此可以通過聚族索引直接找到對應的數據,而不需要再去通過
索引信息去磁盤尋找數據信息(這樣會減少磁盤訪問量)。
覆蓋索引
覆蓋索引就是根據聚族索引的優勢,對查詢的列建立一個覆蓋的索引列信息,這樣索引中就包含了要
查詢的數據信息,這樣也可以避免再去通過索引查找對應的完整數據列。
因此可以通過覆蓋所以優化查詢速度,但是又不宜對太多字段建立覆蓋索引,此時有個折中方法,先查詢
可以使用覆蓋索引訪問的列,然後對查詢的數據join關聯,從而查找出需要的完整信息。
-- 如果通過覆蓋索引從大量的數據中只返回少量的數據,這時通過join獲取完整信息比直接查詢完整信息效率高;
-- 如果通過覆蓋索引從大量的數據中返回大量的數據,這時與不使用覆蓋索引沒什麼區別;
-- 如果只有少量的數據,則直接查詢會比較省時。
聚族索引和二級索引
mysql中每個表都有一個聚簇索引(clustered index ),除此之外的表上的每個非聚簇索引都是二級索引,又叫輔助索引(secondary indexes)。
以InnoDB來說,每個InnoDB表具有一個特殊的索引稱爲聚集索引。如果表存在主鍵,該主鍵索引是聚集索引。如果未定義主鍵,MySQL取第一個唯一索引(unique)而且只含非空列(NOT NULL)作爲主鍵,InnoDB使用它作爲聚集索引。如果沒有這樣的列,InnoDB就自己產生一個這樣的ID值,它有六個字節,而且是隱藏的,使其作爲聚簇索引。