一. 慢查詢?nèi)罩?
1.1 MySQL的日志類型
日志用于記錄數(shù)據(jù)庫的運(yùn)行情況,以及用戶對(duì)數(shù)據(jù)庫執(zhí)行的各類操作。當(dāng)數(shù)據(jù)庫發(fā)生故障時(shí),可以根據(jù)日志分析和解決問題,從而對(duì)數(shù)據(jù)庫進(jìn)行恢復(fù)。
1.2 認(rèn)識(shí)慢查詢?nèi)罩?/strong>
慢查詢?nèi)罩居糜谟涗汳ySQL數(shù)據(jù)庫中響應(yīng)時(shí)間超過指定閾值的語句。慢查詢?nèi)罩就ǔR脖环Q之為慢日志,因?yàn)樗粌H僅只針對(duì)SELECT
語句,像INSERT、UPDATE、DELETE
等語句,只要響應(yīng)時(shí)間超過所設(shè)定閾值都會(huì)記錄在慢查詢?nèi)罩局小?/p>
1.3 如何開啟慢查詢?nèi)罩久?/strong>
慢查詢?nèi)罩究梢酝ㄟ^命令臨時(shí)設(shè)置,也可以修改配置文件永久設(shè)置。
查看是否開啟慢查詢?nèi)罩?/strong>
show variables like 'slow%';
臨時(shí)開啟慢查詢?nèi)罩?/strong>
set slow_query_log='ON';
set long_query_time=1;
慢查詢?nèi)罩疚募谖恢?/strong>
show variables like '%datadir%';
二. 查詢分析器——EXPLAIN
2.1 explain簡(jiǎn)介
explain命令可以查看SQL語句的執(zhí)行計(jì)劃。當(dāng)explain與SQL語句一起使用時(shí),MySQL將顯示來自優(yōu)化器的有關(guān)語句執(zhí)行計(jì)劃的信息。也就是說,MySQL解釋了它將如何處理語句,包括有關(guān)如何聯(lián)接表以及以何種順序聯(lián)接表的信息。
explain能做什么?
- 分析出表的讀取順序
- 數(shù)據(jù)讀取操作的操作類型
- 哪些索引可以使用
- 哪些索引被實(shí)際使用
- 表之間的引用
- 每張表有多少行被優(yōu)化器查詢
2.2 explain的使用
explain的使用很簡(jiǎn)單,只需要在SQL語句之前加上explain
命令即可,除select
語句外,explain也能分析insert、update和delete
語句。
命令解釋:
三. 索引的基本使用
3.1 什么是索引
索引是一種特殊的數(shù)據(jù)結(jié)構(gòu),類似于圖書的目錄,它能夠極大地提升數(shù)據(jù)庫的查詢效率。如果沒有索引,在查詢數(shù)據(jù)時(shí)必須掃描表中的所有記錄才能找出符合條件的記錄,這種全表掃描的查詢效率非常低。
總結(jié):提高查詢效率,就好像垃圾分類一樣,把一樣效果的東西放在一起,找的時(shí)候好找。
3.2 常見的索引種類
索引是對(duì)數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu),使用索引可快速訪問數(shù)據(jù)庫表中的特定記錄。
數(shù)據(jù)庫的索引好比一本書的目錄,能夠加快數(shù)據(jù)庫的查詢速度;索引是快速搜索的關(guān)鍵,如果不加索引,查找任何一條特定的數(shù)據(jù)都會(huì)進(jìn)行一次全表掃描。
3.3 索引的使用
創(chuàng)建索引
創(chuàng)建普通索引
CREATE INDEX indexName ON tableName(columnName(length));
創(chuàng)建唯一索引
CREATE UNIQUE INDEX indexName ON tableName(columnName(length));
創(chuàng)建復(fù)合索引
CREATE INDEX indexName ON tableName(columnName1, columnName2, …);
刪除索引
DROP INDEX [indexName] ON tableName;
查看索引
SHOW INDEX FROM tableName;
3.4 索引的實(shí)戰(zhàn)經(jīng)驗(yàn)
四. 復(fù)合索引前導(dǎo)列特性
復(fù)合索引前導(dǎo)列特性:在MySQL中,如果創(chuàng)建了復(fù)合索引(name, salary, dept)
,就相當(dāng)于創(chuàng)建了 (name, salary, dept)、(name, salary)和(name) 三個(gè)索引,因此在創(chuàng)建復(fù)合索引時(shí)應(yīng)該將最常用作查詢條件的列放在最左邊,依次遞減。
列:
未使用索引
select * from employee where salary=8800;
select * from employee where dept='部門A';
select * from employee where salary=8800 and dept='部門A';
使用索引:前面都帶有name
select * from employee where name='liufeng';
select * from employee where name='liufeng' and salary=8800;
select * from employee where name='liufeng' and salary=8800 and dept='部門A';
五. 覆蓋索引
5.1 什么是覆蓋索引
覆蓋索引又稱之為索引覆蓋,即select
的數(shù)據(jù)列只從索引中就能得到,不必讀取數(shù)據(jù)行,也就是只需掃描索引就可以得到查詢結(jié)果。
關(guān)于覆蓋索引的幾點(diǎn)說明:
- 使用覆蓋索引,只需要從索引中就能檢索到需要的數(shù)據(jù),而不要再掃描數(shù)據(jù)表;
- 索引的體量往往要比數(shù)據(jù)表小很多,因此只讀取索引速度會(huì)非???,也會(huì)極大減少數(shù)據(jù)訪問量;
- MySQL的查詢優(yōu)化器會(huì)在執(zhí)行查詢前判斷,是否有一個(gè)索引可以覆蓋所有的查詢列;
- 并非所有類型的索引都可以作為覆蓋索引,覆蓋索引必須要存儲(chǔ)索引列的值。像哈希索引、空間索引、全
- 文索引等并不會(huì)真正存儲(chǔ)索引列的值。
5.2 如何判斷使用了覆蓋索引
當(dāng)一個(gè)查詢使用了覆蓋索引,在查詢分析器EXPLAIN
的Extra列可以看到“Using index”
。
到此這篇關(guān)于MySQL 各個(gè)索引的使用詳解的文章就介紹到這了,更多相關(guān)MySQL 索引使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
本人博客:https://blog.csdn.net/weixin_46654114
您可能感興趣的文章:- mysql 添加索引 mysql 如何創(chuàng)建索引
- MySQL索引類型總結(jié)和使用技巧以及注意事項(xiàng)
- MySQL查看、創(chuàng)建和刪除索引的方法
- mysql性能優(yōu)化之索引優(yōu)化
- 基于mysql全文索引的深入理解
- Mysql中的Btree與Hash索引比較
- MySQL 索引分析和優(yōu)化
- Mysql使用索引的正確方法及索引原理詳解