成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院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號
偷看娇妻在别人胯下沦陷小说| 国产亚洲精品自在久久| 成人毛片18女人毛片免费| 成人AV在线一区二区三区| 夫妇交换聚会群4P疯狂大战视频| 国产精品对白刺激久久久| 国产日产欧美最新| 久爱WWW成人网免费视频| 精品无码成人片一区二区| 噜噜狠狠色综合久色AⅤ五区| 妺妺和我裸睡玩我下春雨医生| 欧日韩无套内射变态| 日韩熟妇αv无码激情视频| 深田えいみ禁欲后被隔壁人妻| 午夜亚洲国产理论片中文飘花| 亚洲色偷拍另类无码专区| 47147大但人文艺术怎么样| 产高清在线精品一区二区三区 | 奶头从情趣内衣下露了出来AV | 久久精品国产只有精品2020| 麻豆AV一区二区三区| 人人妻人人澡人人爽欧美一区九九 | 国产好深好硬好想要免费视频| 国产真人无遮挡作爱免费视频| 久久久久人妻一区二区三区VR| 欧美日韩一区二区三区人妻 | 欧洲女人牲交视频免费| 视频无码一区二区| 亚洲国产精品VA在线播放| ◇一本大道香蕉中文在线| 东京热一区二区三区| 国产香蕉国产精品偷在线| 乱人伦中文字幕在线| 日韩人妻一区二区| 亚洲成AV不卡无码无码不卡| 18大禁漫画吃奶羞羞漫画| 丁香五月开心婷婷激情综合| 黑人xxx欧美性爱| 欧美黑人又大又粗又长久久久| 天天综合网网欲色| 艳妇臀荡乳欲伦交换H漫画小说| 草草久久久无码国产专区| 韩国无码无遮挡在线观看不卡| 男人扒开女人内裤强吻桶进去 | 哦┅┅快┅┅用力啊┅┅电影| 天美传媒国色天香乱码| 一区二区欧美视频| 国产A级毛片久久久久久精品| 久久久久久亚洲AV成人无码国产| 日本熟妇啪啪日本丰满熟妇啪啪日| 亚洲AV无码专区国产乱码APP| 99国精产品灬源码1688| 国产成人无码精品久久久小说| 久久无码中文字幕免费影院| 色综合天天无码网站| 亚洲自偷图片自拍图片| 夫妻免费无码V看片| 久久久久亚洲精品天堂| 试看A级看一毛片二十分钟| 伊人久久精品久久亚洲一区| 国产成人啪精品视频免费APP| 久久麻豆成人精品| 无码动漫性爽XO视频在线观看不 | 午夜A成V人电影| 99精品视频一区在线观看| 国产亚洲成AⅤ人片在线观看 | 99W乳液78W78W永久| 好爽…又高潮了毛片无广告| 欧美视频一区二区图文| 亚洲欧美韩国综合色| 丰满人妻熟妇乱又伦精品| 乱码A区D区C区| 卫生间被教官做好爽HH视频| 中文字幕一本性无码| 国产专区国产AV| 人人玩人人添人人澡| 一本一道AV无码中文字幕麻豆| 国产精品美女久久久网站| 欧美肉欲XXⅩOOO性| 亚洲综合色婷婷在线观看| 丰满日韩放荡少妇无码视频| 民工把奶头吸得又大又长| 亚洲AV无码成人精品网站| 赤裸羔羊Ⅲ致命快感 电影| 脔到她哭H粗话HWWW男男动漫| 亚洲AV嫩草AV极品在线观看| 波多野结衣高潮AV在线播放| 久久婷婷五月综合色奶水99啪| 无码人妻一区二区三区麻豆| XXXAV久久久久久久久久久| 激情无码人妻又粗又大中国人| 日本免费一区二区三区最新VR| 又湿又黄裸乳漫画无遮挡网站 | 我是你可爱的小猫| おとまりせくす中文在线| 乱人伦中文无码视频| 亚洲国产精品无码久久久蜜芽 | 久久ER99热精品一区二区| 调教后把奶头拴在跑步机上虐| 暗交拗女一区二区三区| 免费无码AV片在线观看| 亚洲日韩精品无码AV海量| 国产一区二区精品久久岳| 欧美性狂猛BBBBBBXXXX| √天堂资源中文WWW| 久久久久亚洲精品无码网址色欲| 亚洲AV无码专区国产乱码不卡| 国产精品美女久久久久AV福利| 日产2021免费一二三四区| 43417大但人文艺术| 久碰人妻人妻人妻人妻人掠| 亚洲欧洲美洲无码精品VA| 国产午夜精华无码网站| 无码AV无码免费一区二区| 给个网站2021年直接进入的| 人妻被黑人与白人巨大中出| 99精品国产高清一区二区| 免费看又黄又无码的网站| 一本一本久久AA综合精品| 久久国产乱子伦免费精品 | 野花日本免费完整版高清版8| 黑人又大又粗又硬XXXXX| 小12国产萝裸体视频福利| 国产精品美女久久久网站| 婷婷久久久亚洲欧洲日产国码AV| 粉嫩小泬久久久久久久久久小说| 日本猛少妇色XXXXX猛叫小说| となりの家のネツト在线| 牛牛影视亚洲AV成人片| 7777色鬼XXXX欧美色妇| 嫩草欧美曰韩国产大片| 1000部无遮挡拍拍拍免费视频| 免费观看添你到高潮视频| 中文字幕无码日韩AV| 麻豆亚洲AV熟女国产一区二| 在线看AV的网站| 免费啪啪全程无遮挡60分钟| 51精产国品一二三产区区| 年轻丰满的继牳3免费看| 综合 欧美 小说 另类 图| 欧美XXXⅩ重口变态调教| BGMBGM浓毛老太太| 日本适合十八岁以上的护肤品一| 菠萝蜜国际通道一区麻豆| 拍摄AV现场失控高潮数次| 成年无码动漫AV片在线观看羞羞| 日韩精品专区在线影院重磅| 国产成人AV综合久久视色| 性欧美18-19SEX性高清播| 激情综合亚洲色婷婷五月APP| 亚洲一区二区三区 无码| 老外和中国女人毛片免费视频| 97久久精品人妻人人搡人人玩| 人人妻人人做从爽精品| 丁香激情五月中文字幕亚洲| 无码人妻丝袜在线视频| 狠狠色丁香久久综合| 英语老师没戴套让我C了一节课| 女人18片毛片60分钟中国| 波多野结衣AV在线| 天堂А√在线最新版中文在线| 国产精品无码久久久久| 亚洲精品国精品久久99热| 久久人人爽天天玩人人妻精品| 18岁日韩内射颜射午夜久久成人| 欧美AⅤ精品一区二区三区| 99热这里只有精品免费播放| 人妻体内射精一区二区 | 中文字幕精品亚洲无线码二区| 青草国产超碰人人添人人碱| 国产AV高清无亚洲| 亚洲va熟妇自拍无码区| 毛茸茸性XXXX毛茸茸毛茸茸| CHINESE老女人老熟妇HD| 色综合久久综合欧美综合网| 黑人大群体交免费视频| 综合一区无套内射中文字幕| 人与畜禽共性关系的重要性| 国产精品视频色拍拍| 亚洲色精品VR一区二区三区 | 激情五月开心婷婷深爱| 亚洲色WWW成人永久网址| 欧美丰满熟妇XXXXX高潮| 国产AV露脸一线国语对白| 亚洲国产精品无码久久青草| 男生晚上睡不着想看B站| 国产A∨国片精品青草视频| 亚洲欧美色国产综合| 欧美日韩一区二区三区精品视频在线| 给丰满丁字裤少妇按摩到高潮| 亚洲精品无码伊人久久| 欧美日韩不卡高清在线看| 国产精品久久久久久久福利| 夜夜躁日日躁狠狠久久AV| 人妻熟妇与黑人HDXⅩXX| 韩国三级中文字幕HD久久精品| 3D动漫同人精品无码专区| 无忧传媒剧国产剧情MV| 美人电影在线观看| 国产成人一区二区三区免费 |