MySQL效能優化 Mysql索引作用

2021-07-22 09:20:32 字數 3217 閱讀 7639

mysql的索引有很多用途。索引並不僅僅是在讀取資料時優 化mysql的效能。這些功能還包括:

-保持資料完整性

-優化資料訪問效能

-改進表的連線(join)操作

-對結果進行排序

-簡化聚合資料操作

mysql用主鍵和唯一鍵(unique key)來執行每個表中儲存數

據的唯一性等級。主鍵和唯一鍵的差別有以下幾點:

1.主鍵

•每個表只能有乙個主鍵。

•主鍵不能包含null值。

•通過主鍵可以獲取表中任意特定行。

•如果定義了 auto increment列,那麼此列必須是主

鍵的一部分。

2.唯一鍵

•表可以有多個唯一鍵

•唯一鍵可以包含null值,並且每個null值都是唯一 的(即 null != null)。

million_words表的主鍵在id列上,這個限制條件確保沒有重 復值。

此外,有些mysql的儲存引擎可以建立外來鍵來保證資料完 整性。外來鍵其實不是索引,它們屬於約束。然而通常情況下大部 分外鍵約束實現的先決條件就是外來鍵所在的表和外來鍵參照的表都 必須有索引,這樣才能管理外來鍵約束。目前在mysql的預設存 儲引擎中,只有innodb支援外來鍵約束且不要求存在對應的索引; 但考慮到效能因素,還是建議在新增外來鍵約束時建立索引。

警告儘管mylsam引擎不支援外來鍵約束,但仍可通過references語法在create table (...) engine=myisam語句中定義外來鍵。

索引可以讓優化器在執行查詢的時候不必檢索表中所有數 據。通過限制需要訪問的行的數目,可以顯著提高查詢速度。這 是索引最普遍的用途。

例如,在含一百萬個詞的範例表中,如果word列沒有新增索 引,那麼每一句select語句都要隨機地逐條掃瞄一百萬行資料, 每次都要從中尋找0或更多匹配的行。雖然這些資料最初就是按 順序載入的,但sql也不能理解這種順序,它必須要處理所有行 才能找到匹配的資料。

警告新增索引並不總是能夠自動改善所有型別的sql查詢的性 能。有時候執行全表掃瞄反而會更高效,這取決於所要求的行數。 這就是兩種不同訪問方式的差異,即通過隨機i/o操作來獲取個 別行的資料和使用索引查詢及有序i/o操作來讀取所有資料。

稍後我們將會舉出更多更詳細的示例來說明如何將索引用於 查詢限制。

除了在給定表上限制需要讀取的資料外,索引的另乙個主要 用途就是快捷高效地在相關的表之間做連線操作。如前所述,在 需要連線的列上使用索引可以顯著提公升效能,並可以在另乙個表 中快速找到乙個匹配的值。掌握建立正確的索引來高效執行錶連 接的操作是所有關係型資料庫sql效能優化的基礎。

mysql索引把資料儲存在乙個有序的**中。如果希望 select語句的結果是有序的,那麼就應該適當地使用索引。通 過order by關鍵字可以對任意select查詢的結果進行排序。 如果在需要排序的列上沒有找到索引,mysql —般會對獲取的表 行進行內部排序。在高併發系統中使用預先建立的索引可以帶來 巨大的效能改進,這些系統每秒需要對幾百幾千條單獨的查詢結 果進行排序,此後這些查詢結果順理成章地按順序存放在索引中 了。但是僅僅簡單地根據讀者對查詢結果的順序要求建立乙個索 引並不總是意味著mysql會選用它。第4章會討論mysql如何 選用索引以及它的限制和不足。

索引還可以作為一種更方便的計算聚合結果的工具。例如在 計算指定時期內所有賬單的總和時,如果在日期和賬單賬戶上添 加合適的索引就可以更高效地執行。下次將會通過例子介紹如 何通過建立支援聚合操作的合適的索引。

如果讀者對mysql不熟悉,或者更了解其他關係型資料庫 系統,那麼可能需要花一些時間來理解儲存引擎這個概念。總體 來說,儘管mysql是通過結構化查詢語言(sql)來與資料互動並 管理資料,但是在mysql內部可以有多種不同的機制來管理存 儲並且獲取底層資料。mysql的儲存引擎的靈活性是一把雙刃 劍。本書不打算介紹儲存引擎的細節部分,但讀者很有必要了 解一些有關儲存引擎的功能和特性的基本資訊,主要包括以下幾 方面:

•事務性和非事務性 •永續性和非永續性 •表和行級鎖定

•不同的索引方法,例如b•樹、b+樹、雜湊以及r-樹 •聚簇索引和非聚簇索引 •主碼索引和非主碼索引 •資料壓縮 •全文索引能力

mysql支援來自其他服務提供商的外掛程式化儲存引擎,這些引 擎中有開源的也有商業的。作為乙個開源產品,mysql有很多種 衍生版本,這些衍生版本支援更多不同種類的儲存引擎。

本書將會集中討論三種主要的儲存引擎,這三種也是mysql 預設包含的引擎:

• mylsam —種非事務性的儲存引擎,是mysql 5.5之前 版本預設的儲存引擎

•innodb最流行的事務性儲存引擎,從5.5版開始成為 mysql的預設引擎

•memory顧名思義,這是一種基於記憶體的、非事務性的 以及非永續性的儲存引擎

注意從5.5版本開始,mysql表的預設儲存引擎從mylsam換 成了 innodb。這將會在使用者安裝那些依賴預設設定或者專門為 mylsam編寫的軟體包時帶來很大影響。

當前版本的mysql也包括一些內建的儲存引擎,例如 archive、merge、blackhole 以及 csv 等。其他一些由 mysql或者第三方提供的儲存引擎還包括federated、extradb、 tokudb、ndb、maria、infindb 和 infobright 等。

小技巧使用者可以使用 show create table、show table status 或者 information_schema.tables 來檢視任何給 定表使用的儲存引擎。

索引專業術語

讀者可能容易混淆對索引的所有專業術語的理解。以下是對 這些術語的介紹:

索引技術

這個詞是關於不同資料結構如何用不同的方法訪問底層資訊的理 論。這些技術包括b-樹、b+樹、r-樹以及雜湊。每一種技術都採 用不同的概念來實現一種特定目標或資料結構的優勢

索引實現

這個詞是關於mysql及各種儲存引擎實現不同的資料結構技術 的方法。例如,mylsam引擎實現心樹的方法和innodb實現的 方法就有所不同

索引型別

這個詞是描述索引的普遍用法的。索引的型別包括主鍵,唯一鍵, 非主碼索引,全文本索引以及空間型別。每種型別支援在單一列、 多列(也叫做混合列)或者列的一部分上定義特定的索引型別。最 後,這些索列型別中的乙個或多個會成為所謂的覆蓋索引

mysql效能優化 mysql效能優化

優化方式 1.空間換時間 冗餘 2.時間換空間 字段優先使用型別 int date char varchar text 索引型別 btree索引 hash索引 索引的葉子下,存放乙個資訊指向所在行的資料位址。btree有利於範圍查詢,hash有利於精確查詢。btree用的更多一些。btree索引的常...

mysql的效能優化 mysql效能優化

檢視安裝指令碼 select version 非互動式超時時間,如jdbc show global variables like wait timeout 互動式超時時間,如資料庫工具 show global variables like interactive timeout show sessi...

mysql 效能優化 命令 mysql效能優化

發現問題 當發現程式執行比較慢的時候,首先排除物力資源問題之後,就將注意力轉向mysq資料庫 1 首先確定執行慢的sql語句 mysql show full processlist 2 確認低效的查詢 多次執行第一步發現time耗費大的sql語句。檢視耗費的時間。3 分析效能 為sql生成乙個執行計...