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的公司,資料庫快...