成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

值得收藏的MySql基礎知識總結(SQL優化篇)

本篇的主要內容是通過explain逐步分析sql,并通過修改sql語句與建立索引的方式對sql語句進行調優,也可以通過查看日志的方式,了解sql的執行情況,還介紹了MySQL數據庫的行鎖和表鎖。希望對大家有幫助。

值得收藏的MySql基礎知識總結(SQL優化篇)

一、explain返回列簡介

1、type常用關鍵字

system > const > eq_ref > ref > range > index > all。

  1. system:表僅有一行,基本用不到;
  2. const:表最多一行數據配合,主鍵查詢時觸發較多;
  3. eq_ref:對于每個來自于前面的表的行組合,從該表中讀取一行。這可能是最好的聯接類型,除了const類型;
  4. ref:對于每個來自于前面的表的行組合,所有有匹配索引值的行將從這張表中讀取;
  5. range:只檢索給定范圍的行,使用一個索引來選擇行。當使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比較關鍵字列時,可以使用range;
  6. index:該聯接類型與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因為索引文件通常比數據文件小;
  7. all:全表掃描;

實際sql優化中,最后達到ref或range級別。

2、Extra常用關鍵字

Using index:只從索引樹中獲取信息,而不需要回表查詢;

Using where:WHERE子句用于限制哪一個行匹配下一個表或發送到客戶。除非你專門從表中索取或檢查所有行,如果Extra值不為Using where并且表聯接類型為ALL或index,查詢可能會有一些錯誤。需要回表查詢。

Using temporary:mysql常建一個臨時表來容納結果,典型情況如查詢包含可以按不同情況列出列的GROUP BY和ORDER BY子句時;

索引原理及explain用法請參照前一篇:MySQL索引原理,explain詳解

二、觸發索引代碼實例

1、建表語句 + 聯合索引

CREATE TABLE `student` (   `id` int(10) NOT NULL,   `name` varchar(20) NOT NULL,   `age` int(10) NOT NULL,   `sex` int(11) DEFAULT NULL,   `address` varchar(100) DEFAULT NULL,   `phone` varchar(100) DEFAULT NULL,   `create_time` timestamp NULL DEFAULT NULL,   `update_time` timestamp NULL DEFAULT NULL,   `deleted` int(11) DEFAULT NULL,   PRIMARY KEY (`id`),   KEY `student_union_index` (`name`,`age`,`sex`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、使用主鍵查詢

值得收藏的MySql基礎知識總結(SQL優化篇)

3、使用聯合索引查詢

值得收藏的MySql基礎知識總結(SQL優化篇)

4、聯合索引,但與索引順序不一致

值得收藏的MySql基礎知識總結(SQL優化篇)

備注:因為mysql優化器的緣故,與索引順序不一致,也會觸發索引,但實際項目中盡量順序一致。

5、聯合索引,但其中一個條件是 >

值得收藏的MySql基礎知識總結(SQL優化篇)

6、聯合索引,order by

值得收藏的MySql基礎知識總結(SQL優化篇)

where和order by一起使用時,不要跨索引列使用。

三、單表sql優化

1、刪除student表中的聯合索引。

值得收藏的MySql基礎知識總結(SQL優化篇)

2、添加索引

alter table student add index student_union_index(name,age,sex);

值得收藏的MySql基礎知識總結(SQL優化篇)

優化一點,但效果不是很好,因為type是index類型,extra中依然存在using where。

3、更改索引順序

因為sql的編寫過程

select distinct ... from ... join ... on ... where ... group by ... having ... order by ... limit ...

解析過程

from ... on ... join ... where ... group by ... having ... select distinct ... order by ... limit ...

因此我懷疑是聯合索引建的順序問題,導致觸發索引的效果不好。are you sure?試一下就知道了。

alter table student add index student_union_index2(age,sex,name);

刪除舊的不用的索引:

drop index student_union_index on student

索引改名

ALTER TABLE student RENAME INDEX student_union_index2 TO student_union_index

更改索引順序之后,發現type級別發生了變化,由index變為了range。

range:只檢索給定范圍的行,使用一個索引來選擇行。

值得收藏的MySql基礎知識總結(SQL優化篇)

備注:in會導致索引失效,所以觸發using where,進而導致回表查詢。

4、去掉in

值得收藏的MySql基礎知識總結(SQL優化篇)

ref:對于每個來自于前面的表的行組合,所有有匹配索引值的行將從這張表中讀取;

index 提升為ref了,優化到此結束。

5、小結

  1. 保持索引的定義和使用順序一致性;
  2. 索引需要逐步優化,不要總想著一口吃成胖子;
  3. 將含in的范圍查詢,放到where條件的最后,防止索引失效;

四、雙表sql優化

1、建表語句

CREATE TABLE `student` (   `id` int(10) NOT NULL,   `name` varchar(20) NOT NULL,   `age` int(10) NOT NULL,   `sex` int(11) DEFAULT NULL,   `address` varchar(100) DEFAULT NULL,   `phone` varchar(100) DEFAULT NULL,   `create_time` timestamp NULL DEFAULT NULL,   `update_time` timestamp NULL DEFAULT NULL,   `deleted` int(11) DEFAULT NULL,   `teacher_id` int(11) DEFAULT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `teacher` (   `id` int(11) DEFAULT NULL,   `name` varchar(100) DEFAULT NULL,   `course` varchar(100) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、左連接查詢

explain select s.name,t.name from student s left join teacher t on s.teacher_id = t.id where t.course = '數學'

值得收藏的MySql基礎知識總結(SQL優化篇)

上一篇介紹過,聯合查詢時,小表驅動大表。小表也稱為驅動表。其實就相當于雙重for循環,小表就是外循環,第二張表(大表)就是內循環。

雖然最終的循環結果都是一樣的,都是循環一樣的次數,但是對于雙重循環來說,一般建議將數據量小的循環放外層,數據量大的放內層,這是編程語言的優化原則。

再次代碼測試:

student數據:四條

值得收藏的MySql基礎知識總結(SQL優化篇)

teacher數據:三條

值得收藏的MySql基礎知識總結(SQL優化篇)

按照理論分析,teacher應該為驅動表。

值得收藏的MySql基礎知識總結(SQL優化篇)

sql語句應該改為:

explain select teacher.name,student.name from teacher left join student on teacher.id = student.id  where teacher.course = '數學'

優化一般是需要索引的,那么此時,索引應該怎么加呢?往哪個表上加索引?

索引的基本理念是:索引要建在經常使用的字段上。

on teacher.id = student.id可知,teacher表的id字段使用較為頻繁。

left join on,一般給左表加索引;因為是驅動表嘛。

值得收藏的MySql基礎知識總結(SQL優化篇)

alter table teacher add index teacher_index(id); alter table teacher add index teacher_course(course);

值得收藏的MySql基礎知識總結(SQL優化篇)

備注:如果extra中出現using join buffer,表明mysql底層覺得sql寫的太差了,mysql加了個緩存,進行優化了。

3、小結

  1. 小表驅動大表
  2. 索引建立在經常查詢的字段上
  3. sql優化,是一種概率層面的優化,是否實際使用了我們的優化,需要通過explain推測。

五、避免索引失效的一些原則

1、復合索引,不要跨列或無序使用(最佳左前綴);

2、符合索引,盡量使用全索引匹配;

3、不要在索引上進行任何操作,例如對索引進行(計算、函數、類型轉換),索引失效;

4、復合索引不能使用不等于(!=或<>)或 is null(is not null),否則索引失效;

5、盡量使用覆蓋索引(using index);

6、like盡量以常量開頭,不要以%開頭,否則索引失效;如果必須使用%name%進行查詢,可以使用覆蓋索引挽救,不用回表查詢時可以觸發索引;

7、盡量不要使用類型轉換,否則索引失效;

8、盡量不要使用or,否則索引失效;

六、一些其他的優化方法

1、exist和in

select name,age from student exist/in (子查詢);

如果主查詢的數據集大,則使用in;

如果子查詢的數據集大,則使用exist;

2、order by 優化

using filesort有兩種算法:雙路排序、雙路排序(根據IO的次數)

MySQL4.1之前,默認使用雙路排序;雙路:掃描兩次磁盤(①從磁盤讀取排序字段,對排序字段進行排序;②獲取其它字段)。

MySQL4.1之后,默認使用單路排序;單路:只讀取一次(全部字段),在buffer中進行排序。但單路排序會有一定的隱患(不一定真的是只有一次IO,有可能多次IO)。

注意:單路排序會比雙路排序占用

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
国产精品毛片Av无码一区二区 | 动漫RH男男车车好快的车车| 顶级RAPPER潮水日本| 国产成人丝袜视频在线观看 | 亚洲AV永久精品无码| 亚洲精品无码乱码成人爱色| 尤物AV无码色AV无码麻豆| 中文字幕人妻偷伦在线视频| XXX.日本学生妹.COM| 丰满多毛的大隂户毛茸茸| 国产日韩AV无码免费一区二区三| 饥渴老熟妇乱子伦视频| 久久夜色撩人精品国产| 欧美日韩国产精品| 水蜜桃成视频人在线看| 亚洲VA中文字幕无码一区| 玉蒲团之玉女心经| 波多野结衣Av无码久久一区二区| 国产精品一线二线三线精华液| 久久99精品久久久久久久久久| 男男黄GAY片免费网站WWW| 色伦专区97中文字幕| 亚洲VA久久久噜噜噜熟女8| 中文字幕乱码一区二区三区免费| 成人Α片免费视频在线观看| 国内精品久久久久久无码不卡| 鲁大师在线影院免费观看| 日韩精品无码一本二本三本| 亚洲AV无码乱码国产精品久久| 在线看片无码永久免费AV| 产高清在线精品一区二区三区| 国产亚洲日韩在线A不卡| 蜜桃91人妻在线视频| 少妇被粗大的猛烈进出视频| 亚洲精品中文字幕乱码三区| NARUTOMANGA全彩纲手| 国产日产欧产精品精品APP| 乱老熟女成熟50ⅩXXX小| 色一情一乱一伦麻豆| 亚洲色18禁成人网站WWW| А天堂最新版中文网| 好硬好涨老师受不了了| 欧美性一区二区三区| 亚洲AⅤ男人的天堂在线观看| 中文在线っと好きだった最新版 | 久久午夜无码免费| 少妇短裙公车被直接进入| 亚洲熟妇一区二区三区| 成熟交BGMBGMBGM中国| 精品无人码麻豆乱码1区2区| 日本SM/羞辱/调教/捆绑视频| 亚洲国产成人精品无码区2021| AV一区二区三区| 国产亚洲日韩网曝欧美台湾| 青青草原综合久久大伊人| 亚洲AV综合色区无码一区偷拍| FREE性玩弄少妇HD| 娇妻在厨房被朋友玩得呻吟| 人善交VIDEOS欧美3D| 亚洲一级 片内射无码| 粉嫩av一区二区夜夜嗨| 蜜桃AV秘 无码一区二区三欧| 西方14147大但人文艺术| BT天堂最新版在线WWW| 韩国精品一区二区无码视频| 日本JAPANESE丰满白浆| 影音先锋AⅤ无码资源网| 国产乱码一卡二卡3卡4卡网站| 男人猛躁进女人免费播放| 亚洲A级成人无码网站| 成人AV毛片无码免费网站| 久久自己只精产国品| 亚A∨国AV综AV涩涩涩| 波多野结衣一区二区三区高清 | 亚洲AV噜噜在线成人网站| 菠萝视频高清视频在线7| 久久亚洲AV成人无码国产最大| 无码人妻啪啪一区二区| 爱情岛永久地址WWW成人| 久久精品国产亚洲AV无码麻豆 | 久久人妻无码中文字幕| 亚洲AV无码国产蜜桃麻豆| 成熟丰满女人丰满妇女aⅴ| 人妻含泪让粗大挺进| 男生把QQ放进女生的QQ里韩剧| 亚洲AV无码潮喷在线观看蜜桃| 菠萝蜜国际通道一区麻豆| 停不了的爱在线观看| 亚洲中文字幕无码第一区| 国产精品爽爽VA在线观看| 日本老肥婆BBBWBBBWZR| 18禁无遮挡啪啪摇乳动态图| 精品人伦一区二区三区潘金莲| 无码A∨高潮抽搐流白浆8MAV| 暗夜免费观看在线完整版| 麻豆视频传媒入口| 亚洲性日韩精品一区二区三区| 国产午夜手机精彩视频| 四虎永久在线精品视频| 成年女人18毛片毛片免费不卡| 农村肥BWBWBWBWBW| 制服丝袜另类专区制服| 精品一区二区成人精品| 亚洲AV中文AⅤ无码AV不卡| 国产精品亚洲专区无码唯爱网| 少妇高潮毛片免费看| 波多野结衣高清一区二区三区 | 国产精品亚洲精品日韩动图| 色欲狠狠躁天天躁无码中文字幕| 爸的比老公大两倍儿媳叫什么呢 | 秋霞国产成人精品午夜视频APP| 最新国产成人无码久久| 邻居一晚让我高潮3次正常吗| 亚洲中文字幕无码中文字| 精品久久香蕉国产线看观看亚洲| 亚洲AV永久无码精品天堂动漫| 国产一产二产三精华液区别在哪| 无码夫の前で人妻を侵犯| 国产成人综合亚洲AV第一页| 天天躁日日躁狠狠躁人妻| 国产SM鞭打折磨调教视频 | 国产成人精品人人| 特黄熟妇丰满人妻无码| 国产成人精品综合久久久久 | 国产成人午夜福利院| 天天拍天天看天天做| 国产精品久久国产三级国| 我们还没在书房试过| 国产裸体美女永久免费无遮挡| 西西人体444WWW高清大但| 国产又粗又黄又爽的大片| 亚洲AⅤ永久无码精品| 好男人2019在线视频播放观看| 亚洲爆乳成AV人在线蜜芽| 精品视频国产香蕉尹人视频| 亚洲欲色欲色XXXXX在线| 久久婷婷五月综合色和啪| 中文国产成人精品久久APP| 免费看成人A级毛片| 91夜色精品偷窥熟女精品网站| 欧美性猛交XXXⅩ乱大交| 啊灬啊灬高潮来了…视频APP| 日韩AV在线一区二区| 国产成人A∨麻豆精品| 无码专区—VA亚洲V专区VR| 国自产拍偷拍精品啪啪AV| 亚洲另类无码专区偷拍| 久久亚洲精品无码观看| 91人妻人人爽人人狠狠| 人人爽人人澡人人人妻百度| 国产AⅤ夜夜欢一区二区三区 | 最新中文字幕AV无码不卡| 欧美一区二区三区性视频野战| 别揉我奶头~嗯~啊~| 天天做天天爱天天综合网| 国内揄拍国内精品少妇国语| 亚洲午夜理论无码电影| 嫩BBB槡BBBB搡BBBB| 处破痛哭A√18成年片免| 小浪蹄子蜜水噗呲噗呲的| 久久精品国产亚洲不AV麻豆| 97久久精品人妻人人搡人人玩| 日韩乱妇乱女熟妇熟女AV| 国产免费人成在线视频| 亚洲最大AV无码网址| 欧美视频一区二区三区四区| 寡妇下面好黑好毛| 亚洲精品无码不卡| 免费无码又爽又刺激毛片| 成人拳交喷水在线播放| 午夜熟女插插XX免费视频| 久久久久精品国产三级美国美女| CHINESE叫床对白VIDEOS| 天天想你在线视频免费观看高清版| 好爽又高潮了毛片| 97色伦综合在线欧美视频| 熟妇高潮一区二区麻豆Av渉谷| 韩日午夜在线资源一区二区| 最新中文字幕AV专区| 十八禁羞羞爽爽爽爱爱午夜网| 精品成在人线AV无码免费看| 91麻豆精品无码一区二区三区| 天堂中文在线最新版WWW| 久久精品久久久久观看99水蜜桃| TPU色母和PA6色母的性能| 无码AV不卡一区二区三区| 久久久久久精品免费免费WE| 槽溜2021入口一二三四绿巨人| 亚洲 欧美 激情 小说 另类| 免费一对一刺激互动聊天软件| 国产成人精品一区二区三区免费| 野花免费高清完整在线观看| 人人妻熟妇中年乱子伦A| 国内自产少妇自拍区免费| CHINESE宅妇内射AV| 亚洲AV无码成人网站WWW| 欧美成人A猛片在线观看| 国产乱人伦偷精品视频下| 99久久综合狠狠综合久久止| 亚洲AV成人一区二区三区AV|