MySQL產生回表的原因
什么是回表
回表是指在使用索引查詢時,MySQL需要根據索引值查找相應的行數據時,發現返回的行數據不僅僅是只有索引列的值,還有其他列的數據,此時MySQL會使用返回的行數據的主鍵值再次查找一遍,獲取完整的行數據的過程就叫回表。
為什么會產生回表
1. 非主鍵索引不包含所有查詢字段
非主鍵索引只保存索引列和主鍵列,當查詢需要的列不全部被所使用的非主鍵索引覆蓋時,MySQL需要回表查找主鍵值,并盡可能地從表中取回數據。雖然這會增加額外的操作,但是相比做全表掃描,它顯然是更加高效的。
2. 使用聚集索引的其它列
在使用多列聚集索引查詢時,如果查詢的列并不是索引的第一列,那么MySQL需要先根據索引查找到相應行的主鍵,然后再通過主鍵查找到所有需要的列數據。
3. 計算查詢中的表達式
如果查詢中包含某些需要計算的表達式,比如計數、求和等函數,MySQL需要使用返回的行數據的主鍵值再次查找一遍,獲取完整的行數據進行計算。
如何避免回表
1. 使用覆蓋索引
覆蓋索引是指索引包含了全部需要查詢的字段,查詢的時候直接使用索引獲取數據,避免了回表的過程。
2. 使用合適的聚集索引
聚集索引是指按照特定的列順序存儲數據的索引,在某些情況下設置合適的聚集索引減少回表的次數。
3. 減少使用計算表達式
避免使用函數、表達式等操作在查詢中,降低回表的次數。
上一篇nginx和vue