高效能MySQL 5 建立高效能的索引

2021-10-03 02:55:29 字數 2144 閱讀 3733

儲存引擎使用索引:1、在索引中找到對應值,2、據匹配的索引記錄找到對應資料行。

雜湊索引(hash index)基於雜湊表實現,只有精確匹配索引所有列的查詢才有效,只有memory 引擎顯式支援雜湊索引。

雜湊索引的限制

innodb有「自適應雜湊索引」,當某些索引值被非常頻繁使用時,會在記憶體中基於b+tree索引上再建立乙個雜湊索引,是完全自動的內部行為,無法控制或配置。

偽雜湊索引,舉例:以要所搜的長url建立始希值字段,並加上索引。

空間資料索引(r-tree),以myisam表支援空間索引,可以用作地理資料儲存,mysql的gis支援並不完善,大部分人都不會用這個特性,開源資料庫系統中對gis的解決方案做的比較好的是postgresql的postgis

適用於match against操作,而不是普通的where條件操作。

索引大大減少了伺服器需要掃瞄的資料量

索引可以幫助伺服器避免排序和臨時表索引可以將隨機i/o變為順序i/o

索引將相關的記錄放到一起則獲得一星

就是whee後面的等值謂詞,可以匹配索引列順序

where後面的謂詞和索引列匹配的越多,索引片越窄,最終掃瞄的資料行也是越小

如果索引中的資料順序和查詢中的排序一致則獲得二星

退免排序,如果結果集採用現有順序讀取,那麼就會避免一次排序,避免提前物化結果集

如果索引中的列包含了查詢中需要的全部列則獲得三星

避免每乙個索引行查詢,都需要去聚族索引進行一次隨機io查詢

聚簇索引優點

更快的資料訪問

缺點主要3個工作,找到並修復損壞的表,維護準確的索引統計資訊,減少碎片。

1、check table檢查表是否損壞, alter table innodb_tb1 engine= innodb;修復表

還可以使用一些儲存引擎的工具,如 myisamchk,或者將資料匯出乙份再重新匯入;

如果損壞的表系統區域或是表的」行資料」區域,而不是索引,可以從備份中恢復,或者嘗試從損壞的資料檔案中盡可能的恢復資料。

如果是 innodb引擎的表出現了損壞,一定是傳送了嚴重的錯誤,比如硬體問題記憶體或硬碟,或從外部操作了資料檔案,或innodb的缺陷(不太可能),常見類似錯誤是由於嘗試使用的rsync備份innob導致的

如果遇到資料損壞,最重要的是找出是什麼導致了損壞,而不只是簡單修復,否則很可能還會不斷損壞

可以通過設定 innodb_force_recovery引數進入 innodb強制恢復模式來修復資料。還可以使用開源的 innodb資料恢復工具箱( innodb data recovery toolkit)直接從innodb資料檔案恢復出資料。

2.更新索引統計資訊

mysql查詢優化器會通過2個api來了解儲存引擎的索引值的分布資訊;

records_in_range()通過向儲存引擎傳入兩個邊界值獲取在這個範圍大概有多少條記錄,對於 innodb不精確

info()返回各種型別的資料,包括索引的基數.

通過執行 analyze table重新生成統計資訊;

innodb通過抽樣的方式來計算統計資訊,首先隨機讀取少量索引頁面,以此為樣本計算統計資訊

innodb_stats_persistent預設on

innodb_stats_ persistent-sample_pages 20

innodb_stats transient_ sample_pages 8

表的大小發生非常的變化(變化超過1/16或新插入20億行)計算索引統計資訊:

innodb開啟某些information schema表或使用 show table和show index或 mysql客戶端開啟自動補全功能時都會觸發索引統計資訊的更新,如果有大量資料,可能會導致嚴重的問題,開關

innodb_stats_on_metadata off

4.可以使用show index from表名命令來檢視索引的基數

5.b-tree索引可能會碎片化,這會降低查詢的效率

innodb alter table table_name engin=innodb;

消除表(聚集索引)的碎片化,索引碎片需要重建索引消除;

myisam optimize table

高效能mysql(一) 建立高效能索引

單列索引和多列索引 單列索引 多個單列索引的選擇問題 多個or條件 多個單列的效能往往效能很低,盡量建立高效的多列索引。多列索引 選擇合適的索引順序 避免範圍條件 在where子句中,in是有效的,範圍條件會導致後面的索引無效!在order by中,範圍條件和in都會導致無法按照索引排序!按照索引順...

建立高效能索引 《高效能Mysql》筆記2

crate table people last name varchar 50 not null,first name varchar 50 not null,dob date not null,gender enum m f not null,key last name,first name,do...

高效能mysql 樹 高效能mysql精要

1 explain 中 extra using index 表示覆蓋索引,sql優化中最好能使用覆蓋索引,否則 二級索引 需要回表查詢。所謂覆蓋索引,是指要查詢的列正好是索引,而條件也是這個索引之一 2 where 語句中 條件等於主鍵的 在核心索引層完成,條件等於非索引的,在服務層完成 3 讀索引...