Mysql 索引的使用

2021-10-12 21:11:51 字數 4984 閱讀 7089

mysql的日誌型別

日誌是用於記錄資料庫的運**況,以及使用者對資料庫執行的各類操作。當資料庫發生故障時,可以根據日誌分析和解決問題,從而對資料庫進行恢復。

日誌描述

重做日誌(redo log)

重做日誌是一種物理格式的日誌,記錄的是物理資料頁面的修改的資訊,其redo log是順序寫入redo log file的物理檔案中去的

回滾日誌(undo log)

回滾日誌是一種邏輯格式的日誌,在執行undo的時候,僅僅是將資料從邏輯上恢復至事物之前的狀態,而不是從物理頁面上操作實現的,這一點是不同於redo log的。

二進位制日誌(binlog)

二進位制日誌是一種邏輯格式的日誌,以二進位制檔案的形式記錄了資料庫中的操作,但不記錄查詢語句。錯誤日誌(errorlog):錯誤日誌記錄著mysql啟動和停止,以及伺服器在執行過程中發生的錯誤的相關資訊。

慢查詢日誌(slow query log)

慢查詢日誌記錄執行時間過長和沒有使用索引的查詢語句。

一般查詢日誌(general log)

記錄了伺服器接收到的每乙個查詢或是命令,無論這些查詢或是命令是否正確甚至是包含語法錯誤,general log都會將其記錄下來。

中繼日誌(relay log)

中繼日誌類似於二進位制;可用於複製架構中,使從伺服器和主伺服器的資料保持一致。

慢查詢日誌

慢查詢日誌用於記錄mysql資料庫中響應時間超過指定閾值的語句。慢查詢日誌通常也被稱之為慢日誌,因為它不僅僅只針對select語句,像insert、update、delete等語句,只要響應時間超過所設定閾值都會記錄在慢查詢日誌中。

引數描述

slow_query_log是否開啟慢查詢日誌,1表示開啟,0表示關閉。

slow_query_log_file慢查詢日誌儲存路徑,可選。注意:mysql 5.6之前的版本,引數名為log-slow-queries

long_query_time閾值,當sql語句的響應時間超過該閾值就會被記錄到日誌中。

log_queries_not_using_indexes

未使用索引的查詢也被記錄到慢查詢日誌中,可選。

log_output

日誌儲存方式,預設為file。 log_output= 'file』表示將日誌存入檔案 log_output= 'table』表示將日誌存入資料庫 log_output= 'file,table』表示同時將日誌存入檔案和資料庫

如何開啟慢查詢日誌

慢查詢日誌可以通過命令臨時設定,也可以修改配置檔案永久設定。

#檢視是否開啟慢查詢日誌

show variables like

'slow%'

;#臨時開啟慢查詢日誌

set slow_query_log=

'on'

;#如果提示引數是全域性的,需要在前面加global

set long_query_time=1;

#慢查詢日誌檔案所在位置

show variables like

'%datadir%'

;

查詢分析器explain

explain命令可以檢視sql語句的執行計畫。當explain與sql語句一起使用時,mysql將顯示來自優化器的有關語句執行計畫的資訊。也就是說,mysql解釋了它將如何處理語句,包括有關如何聯接表以及以何種順序聯接表的資訊。

explain能做什麼?

分析出表的讀取順序

資料讀取操作的操作型別

哪些索引可以使用

哪些索引被實際使用

表之間的引用

每張表有多少行被優化器查詢

explain的使用

explain的使用很簡單,只需要在sql語句之前加上explain命令即可,除了select語句外,explain也能分析insert、update和delete語句。

explain結果解析引數

描述id

執行select子句或操作表的順序

select_type

查詢的型別,如******、primary、subquery、derived、union等

table

當前行使用的表名

partitions

匹配的分割槽

type連線型別,如system、const、eq_ref、ref、range、index、all等(從左到右效果逐漸減弱)

possible_keys

可能使用的索引

key實際使用的索引,null表示未使用索引

key_len

查詢中使用的索引長度

ref列與索引的比較

rows掃瞄的行數

filtered選取的行數佔掃瞄的行數的百分比,理想的結果是100

extra其它額外資訊

索引的使用

什麼是索引

索引是一種特殊的資料結構,類似於圖書的目錄,它能夠極大地提公升資料庫的查詢效率。如果沒有索引,在查詢資料時必須掃瞄表中的所有記錄才能找出符合條件的記錄,這種全表掃瞄的查詢效率非常低。

常見的索引種類

索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定記錄。

資料庫的索引好比一本書的目錄,能夠加快資料庫的查詢速度;

索引是快速搜尋的關鍵,如果不加索引,查詢任何一條特定的資料都會進行一次全表掃瞄。

索引種類

描述普通索引

最基本的索引,沒有任何限制,僅加速查詢。

唯一索引

索引列的值必須唯一,但允許有空值。

主鍵索引

一種特殊的唯一索引,不允許有空值。一般是在建表的同時自動建立主鍵索引。

復合索引

兩個或多個列上的索引被稱作復合索引。

全文索引

對文字內容進行分詞索引。

索引的使用

1、建立索引

#建立普通索引

create

index indexname on tablename(columnname(length));

#建立唯一索引

create

unique

index indexname on tablename(columnname(length));

#建立復合索引

create

index indexname on tablename(columnname1,columnname2,..

.);

2、刪除索引

drop

index

[indexname]

on tablename;

3、檢視索引

show

index

from tablename;

索引的實戰經驗:

選擇區分度高的列建立索引,區分度計算公式:count(distinct col)/count(*),表示欄位不重複的比例

避免對索引列進行計算

每次查詢每張表僅能使用乙個索引

復合索引的前導列特性

在mysql中,如果建立了復合索引(name,salary,dept),就相當於建立了(name,salary,dept)、(name,salary)和(name)三個索引,這被稱為復合索引前導列特性,因此在建立復合索引時應該將最常用作查詢條件的列放在最左邊,依次遞減。

未使用索引的情況

select

*from employee where salary=

8800

;select

*from employee where dept=

'部門a'

;select

*from employee where salary=

8800

and dept=

'部門a'

;

使用索引的情況

select

*from employee where name=

'lau'

;select

*from employee where name=

'lau'

and salary=

8800

;select

*from employee where name=

'lau'

and salary=

8800

and dept=

'部門a'

;

覆蓋索引

覆蓋索引又稱之為索引覆蓋,即select的資料列只從索引中就能得到,不必讀取資料行,也就是只需掃瞄索引就可以得到查詢結果。

關於覆蓋索引的幾點說明:

使用覆蓋索引,只需要從索引中就能檢索到需要的資料,而不要再掃瞄資料表;

索引的體量往往要比資料表小很多,因此只讀取索引速度會非常快,也會極大減少資料訪問量;

mysql的查詢優化器會在執行查詢前判斷,是否有乙個索引可以覆蓋所有的查詢列;

並非所有型別的索引都可以作為覆蓋索引,覆蓋索引必須要儲存索引列的值。像雜湊索引、空間索引、全文索引等並不會真正儲存索引列的值。

如何判斷使用了覆蓋索引

當乙個查詢使用了覆蓋索引,在查詢分析器explain的extra列可以看到』using index』。

mysql 索引的使用

一 什麼是索引!學乙個技術的時候,首先要知道他是什麼,他的作用是什麼,他能幹什麼 索引用來快速地尋找那些具有特定值的記錄,所有mysql索引都以b 樹的形式儲存。如果沒有索引,執行查詢時mysql必須從第乙個記錄開始掃瞄整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就...

mysql索引的使用

索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可以有多個單列索引,但這不是組合索引。組合索引,即乙個索包含多個列。1 普通索引 這是最基本的索引,它沒有任何限制。它有以下幾種建立方式 建立索引 create index indexname on tablename column ...

mysql索引的使用

最近在學mysql,由於對索引沒怎麼接觸過,故做下筆記已被後面參考.假設我們有個公司表沒有建立索引,公司有個編號,當我們要查詢編號為13的公司 其中表中存在很多記錄關於同乙個公司的 由於公司編號沒有排序的,要查詢該公司資訊必須掃瞄全表.如果我們建立了索引,編號會排好序,當我們查詢13的公司,資料庫快...