日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL调优(四):MySQL索引优化实现细节

發(fā)布時間:2024/2/28 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL调优(四):MySQL索引优化实现细节 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

查詢優(yōu)化

在編寫快速的查詢之前,需要清楚一點,真正重要的是響應(yīng)時間,而且要知道在整個SQL語句的執(zhí)行過程中每個步驟都花費了多長時間,要知道哪些步驟是拖垮執(zhí)行效率的關(guān)鍵步驟,想要做到這點,必須要知道查詢的生命周期,然后進行優(yōu)化,不同的應(yīng)用場景有不同的優(yōu)化方式,不要一概而論,具體情況具體分析。

可以看執(zhí)行時間(由于數(shù)據(jù)量比較小,所以差別不是很明顯)

create table user(id int,name varchar(10),phone varchar(11));alter table user add index idx_1(phone);

Join


A join B,一定是先找A,后找B嗎?
不一定。MySQL會進行優(yōu)化。但可以進行constraint_join制定,強制先后順序。
小表Join大表這樣比較好,A是外鍵,B是主鍵索引,A是驅(qū)動表,B是非驅(qū)動表。


將小表放進內(nèi)存的 join buffer 緩沖區(qū)中
可以把默認的join_buffer_size=256K調(diào)大,根據(jù)你的硬件決定。

兩個語句比較

返回結(jié)果一樣
執(zhí)行計劃,看起來是一模一樣的,沒啥區(qū)別
執(zhí)行時間也差不多

on的條件不參與join的運算

其他的一些優(yōu)化點


# 索引優(yōu)化分析案例

預(yù)先準備好數(shù)據(jù)

SET FOREIGN_KEY_CHECKS=0; DROP TABLE IF EXISTS `itdragon_order_list`; CREATE TABLE `itdragon_order_list` (`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵id,默認自增長',`transaction_id` varchar(150) DEFAULT NULL COMMENT '交易號',`gross` double DEFAULT NULL COMMENT '毛收入(RMB)',`net` double DEFAULT NULL COMMENT '凈收入(RMB)',`stock_id` int(11) DEFAULT NULL COMMENT '發(fā)貨倉庫',`order_status` int(11) DEFAULT NULL COMMENT '訂單狀態(tài)',`descript` varchar(255) DEFAULT NULL COMMENT '客服備注',`finance_descript` varchar(255) DEFAULT NULL COMMENT '財務(wù)備注',`create_type` varchar(100) DEFAULT NULL COMMENT '創(chuàng)建類型',`order_level` int(11) DEFAULT NULL COMMENT '訂單級別',`input_user` varchar(20) DEFAULT NULL COMMENT '錄入人',`input_date` varchar(20) DEFAULT NULL COMMENT '錄入時間',PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=utf8;INSERT INTO itdragon_order_list VALUES ('10000', '81X97310V32236260E', '6.6', '6.13', '1', '10', 'ok', 'ok', 'auto', '1', 'itdragon', '2017-08-28 17:01:49'); INSERT INTO itdragon_order_list VALUES ('10001', '61525478BB371361Q', '18.88', '18.79', '1', '10', 'ok', 'ok', 'auto', '1', 'itdragon', '2017-08-18 17:01:50'); INSERT INTO itdragon_order_list VALUES ('10002', '5RT64180WE555861V', '20.18', '20.17', '1', '10', 'ok', 'ok', 'auto', '1', 'itdragon', '2017-09-08 17:01:49');

逐步開始進行優(yōu)化:

第一個案例:

select * from itdragon_order_list where transaction_id = "81X97310V32236260E"; --通過查看執(zhí)行計劃發(fā)現(xiàn)type=all,需要進行全表掃描 explain select * from itdragon_order_list where transaction_id = "81X97310V32236260E";--優(yōu)化一、為transaction_id創(chuàng)建唯一索引create unique index idx_order_transaID on itdragon_order_list (transaction_id); --當創(chuàng)建索引之后,唯一索引對應(yīng)的type是const,通過索引一次就可以找到結(jié)果,普通索引對應(yīng)的type是ref,表示非唯一性索引賽秒,找到值還要進行掃描,直到將索引文件掃描完為止,顯而易見,const的性能要高于refexplain select * from itdragon_order_list where transaction_id = "81X97310V32236260E";--優(yōu)化二、使用覆蓋索引,查詢的結(jié)果變成 transaction_id,當extra出現(xiàn)using index,表示使用了覆蓋索引explain select transaction_id from itdragon_order_list where transaction_id = "81X97310V32236260E";

第二個案例

--創(chuàng)建復(fù)合索引 create index idx_order_levelDate on itdragon_order_list (order_level,input_date);--創(chuàng)建索引之后發(fā)現(xiàn)跟沒有創(chuàng)建索引一樣,都是全表掃描,都是文件排序 explain select * from itdragon_order_list order by order_level,input_date;--可以使用force index強制指定索引 explain select * from itdragon_order_list force index(idx_order_levelDate) order by order_level,input_date; --其實給訂單排序意義不大,給訂單級別添加索引意義也不大,因此可以先確定order_level的值,然后再給input_date排序 explain select * from itdragon_order_list where order_level=3 order by input_date;

索引優(yōu)化分析案例

預(yù)先準備好數(shù)據(jù)

SET FOREIGN_KEY_CHECKS=0; DROP TABLE IF EXISTS `itdragon_order_list`; CREATE TABLE `itdragon_order_list` (`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵id,默認自增長',`transaction_id` varchar(150) DEFAULT NULL COMMENT '交易號',`gross` double DEFAULT NULL COMMENT '毛收入(RMB)',`net` double DEFAULT NULL COMMENT '凈收入(RMB)',`stock_id` int(11) DEFAULT NULL COMMENT '發(fā)貨倉庫',`order_status` int(11) DEFAULT NULL COMMENT '訂單狀態(tài)',`descript` varchar(255) DEFAULT NULL COMMENT '客服備注',`finance_descript` varchar(255) DEFAULT NULL COMMENT '財務(wù)備注',`create_type` varchar(100) DEFAULT NULL COMMENT '創(chuàng)建類型',`order_level` int(11) DEFAULT NULL COMMENT '訂單級別',`input_user` varchar(20) DEFAULT NULL COMMENT '錄入人',`input_date` varchar(20) DEFAULT NULL COMMENT '錄入時間',PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=utf8;INSERT INTO itdragon_order_list VALUES ('10000', '81X97310V32236260E', '6.6', '6.13', '1', '10', 'ok', 'ok', 'auto', '1', 'itdragon', '2017-08-28 17:01:49'); INSERT INTO itdragon_order_list VALUES ('10001', '61525478BB371361Q', '18.88', '18.79', '1', '10', 'ok', 'ok', 'auto', '1', 'itdragon', '2017-08-18 17:01:50'); INSERT INTO itdragon_order_list VALUES ('10002', '5RT64180WE555861V', '20.18', '20.17', '1', '10', 'ok', 'ok', 'auto', '1', 'itdragon', '2017-09-08 17:01:49');

逐步開始進行優(yōu)化:

第一個案例:

select * from itdragon_order_list where transaction_id = "81X97310V32236260E"; --通過查看執(zhí)行計劃發(fā)現(xiàn)type=all,需要進行全表掃描 explain select * from itdragon_order_list where transaction_id = "81X97310V32236260E";--優(yōu)化一、為transaction_id創(chuàng)建唯一索引create unique index idx_order_transaID on itdragon_order_list (transaction_id); --當創(chuàng)建索引之后,唯一索引對應(yīng)的type是const,通過索引一次就可以找到結(jié)果,普通索引對應(yīng)的type是ref,表示非唯一性索引賽秒,找到值還要進行掃描,直到將索引文件掃描完為止,顯而易見,const的性能要高于refexplain select * from itdragon_order_list where transaction_id = "81X97310V32236260E";--優(yōu)化二、使用覆蓋索引,查詢的結(jié)果變成 transaction_id,當extra出現(xiàn)using index,表示使用了覆蓋索引explain select transaction_id from itdragon_order_list where transaction_id = "81X97310V32236260E";

第二個案例

--創(chuàng)建復(fù)合索引 create index idx_order_levelDate on itdragon_order_list (order_level,input_date);--創(chuàng)建索引之后發(fā)現(xiàn)跟沒有創(chuàng)建索引一樣,都是全表掃描,都是文件排序 explain select * from itdragon_order_list order by order_level,input_date;--可以使用force index強制指定索引 explain select * from itdragon_order_list force index(idx_order_levelDate) order by order_level,input_date; --其實給訂單排序意義不大,給訂單級別添加索引意義也不大,因此可以先確定order_level的值,然后再給input_date排序 explain select * from itdragon_order_list where order_level=3 order by input_date;

總結(jié)

以上是生活随笔為你收集整理的MySQL调优(四):MySQL索引优化实现细节的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。