首先博主在工作中發現有同事在進行資料查詢時,使用的是select * 的查詢方式,由於一直知道不建議使用這種方式,但是不知道具體原因,所以查詢了一些資料,簡要來說不建議使用select * 查詢語句的主要原因有以下幾點:
1.過多的多餘欄位會帶來資料傳輸的速度問題,即使mysql客戶端和服務端是處在同一臺機器上,但是mysql還是使用的tcp協議進行資料傳輸,過多的字段必定帶來的是資料傳輸速度的下降。
2.如果欄位中出現類似於text,blob這種長度較大的字段時,mysql會將大長度的字段儲存在其他空間中,不會和其他字段進行相同空間的儲存,所以select * 會增加i/o次數。
3.索引覆蓋問題,下面將詳細介紹。
首先innodb在組織資料時,採用的方式是索引組織表,表中的資料時按照主鍵順序進行存放的,然後再按照主鍵生成一棵b+tree,然後在葉子節點中儲存整張表的資料以及索引值,然後在解釋索引覆蓋之前,我們先解釋一下mysql中的常見的兩個索引概念:輔助索引和聚集索引。
聚集索引:聚集索引也就是我們說的主鍵索引,在聚集索引的葉子節點中儲存的是資料頁,也就是上面我們說的表資料的集合。而且要另外強調的是,在mysql中不同的索引型別對於索引型別的支援是不同的,具體內容大家可以參考《深入淺出mysql》一書。
輔助索引:在輔助索引中,儲存的是鍵值以及指向主鍵索引的書籤。
我們在查詢中,如果使用了輔助索引,mysql會首先查詢到鍵值,然後根據書籤找到主鍵索引,再從表中拿到資料,然後進行返回,所以輔助索引也被稱為是二級索引。
覆蓋索引的意思是說如果乙個查詢語句只需要從輔助索引中就可以得到查詢記錄,而不需要查詢聚集索引中的記錄。也就是說查詢可以直接從索引中取得相應的值,不需要再通過主鍵索引去查詢,這樣的好處是顯而易見的,由於減少了一次索引過渡,所以可以極大的增快查詢速度。
那麼怎麼確定覆蓋索引會被使用到呢?很簡單,只需要在查詢進行前,進行explain一下就可以了,可以通過select type 來確定。
返回我們最初的問題,由於我們在使用select * 進行查詢時,表中的所有欄位不可能全部都有索引,所以就會造成查詢需要根據書籤到資料頁中進行查詢,所以就會降低查詢速度。
好了,這次的分享就這些,博主能力有限,如果有什麼錯誤,還請大家多多指教。
mysql覆蓋索引 MySQL 的覆蓋索引與回表
兩大類索引 使用的儲存引擎 mysql5.7 innodb 聚簇索引 如果表設定了主鍵,則主鍵就是聚簇索引 如果表沒有主鍵,則會預設第乙個not null,且唯一 unique 的列作為聚簇索引 以上都沒有,則會預設建立乙個隱藏的row id作為聚簇索引 innodb的聚簇索引的葉子節點儲存的是行記...
MySQL覆蓋索引呼叫 MySQL 覆蓋索引
什麼是覆蓋索引 建立乙個索引,該索引包含查詢中用到的所有字段,稱為 覆蓋索引 使用覆蓋索引,mysql 只需要通過索引就可以查詢和返回查詢所需要的資料,而不必在使用索引處理資料之後再進行回表操作。覆蓋索引可以一次性完成查詢工作,有效減少io,提高查詢效率。使用示例 查詢語句 select col2,...
Mysql中的聯合索引 字首索引 覆蓋索引
索引 索引是一種特殊的檔案,它們包含著對資料表裡所有記錄的引用指標。更通俗的說,資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度。聯合索引 又名復合索引,由兩個或多個列的索引。它規定了mysql從左到右地使用索引字段,對字段的順序有一定要求。乙個查詢可以只使用索引中的一部分,更準確地說是最左...