mysql查询效率

1.参考

MySQL实战—— Limit与Order by 对查询效率的巨大影响

https://blog.csdn.net/zhibo_lv/article/details/117846795

视频:尚硅谷MySQL数据库高级(bilibili收藏)

2.索引

2.1引入

2.1.1SQL执行慢的原因

1)Sql写的烂

2)索引没建好

3)表设计不好,导致join过多

4)服务器调优和参数设置不合理

2.1.2.sql写的顺序和机读顺序

1)写的顺序

2)机读顺序

2.2基本概念

1)索引是帮助mysql快速查找数据的数据结构

2)不真删除数据,而往往采用假删除的原因:

a.保留数据,业务不用,可以做分析用

b.频繁删除数据,会导致索引失效

c.删除数据会导致出现间隙,引发间隙锁,降低执行效率

3)索引本身也很大,往往以文件的形式存在磁盘

4)索引的数据结构是BTree结构(多路搜索树),其中,聚集索引、次要所以、唯一索引、复合索引、覆盖索引用的是B+树

2.3索引的优势劣势

1)优势:

提高了查询效率,减少了数据库IO成本

提高了排序效率,降低了CPU消耗

提高并发能力,mysql的InnoDB引擎可以添加行锁,行锁是基于索引的,因此可以提高并发能力

2)劣势

索引也是一张表,保存了主键、索引字段,并指向实体表记录(指针),占用空间;

索引虽然提高查询效率,但是会降低更新表的速度,因为维护数据的同时也要维护对应索引

2.4索引的分类

1)单值索引:只包含一个列的索引

2)唯一索引:索引字段的值不重复,但允许空值

3)复合索引:包含多个列

2.5索引的结构与检索原理


1)3层b+树可以表示上百万条数据,定位到数据只发生3次IO,不需要每条数据都IO,性能极大提升

2)真实数据存在叶子节点,如3、5、9、10都是真实数据

3)非叶子节点不存真实数据,只存某种导向信息,如17、35不真实存在于数据表中

2.6适合、不适合建索引的条件

1)适合的:

主键自动建唯一索引

频繁作为查询条件的字段

外键建立索引

2)不适合的

频繁更新的字段

where用不到的字段

高并发下单值索引还是复合索引?---复合索引更好

经常增删改的表不建索引

数据量少的表不建索引

字段值少的(例如枚举)不建索引

2.7单表、双表、三表建索引

单表:在where和orderby的字段上建索引

双表:左联在右表关联字段上建索引,右联在左表关联字段上建索引

三表:同双表经验

2.8建索引注意点:

1)全值匹配最爱:复合索引,查询条件字段与索引字段、顺序都对应;

2)最左匹配原则:(参考:https://blog.csdn.net/zhouchen1998/article/details/124672991)

index_abc:(a, b, c)  //相当于同时有了(a)、(a, b)、(a, b, c)索引

select * from table where a = 'aa' and b ='bb' and c='cc';  //最好,全值匹配

select * from table where c='cc' and b='bb' and a='aa';  //也生效,因为查询优化器会调整顺序,仅有==和in可以顺序随意

select * from table where c='cc' and b='bb';  //索引失效,最左匹配不上

3)不在索引列上做做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效

4)索引,不能使用查询条件为范围的后面的字段

select * from table where a='aa' and b>'bb' and c='cc';  //c失效,b是范围查找后面就失效,大于、小于、between、in、like

                                                                                               //a用于查找,b用于排序,c失效

5)尽量使用覆盖索引(索引字段全覆盖查询字段),减少select*,

select a,c,b from table where c='cc' and b='bb';  //索引生效,因为查询内容覆盖索引,查找索引树,而不是全表搜索

6)使用!=、>、<,会导致索引失效,全表查询

7)is null、is not null也无法使用索引

8)like百分号加右边

select * from table where a like '%aa%';  //索引失效

select * from table where a like '%aa';  //索引失效

select * from table where a like 'aa%';  //可以使用索引

9)like百分号不能加右边,但是还不想索引失效

select a,b,c  from table where a like '%aa%';  //全覆盖索引,使用索引

10)字符串不加单引号,索引失效

select * from table where a = 'aa';  //索引生效

select * from table where a = aa;  //能查出来,优化器执行类型转换。索引失效,隐式的类型转换导致

11)少用or,用它会导致索引失效

select * from table where a = 'aa1' or 'aa2';   //索引失效

3.sql查询优化

3.1分析步骤

1)观察、测试,至少跑1天,看看生产的慢sql情况

2.开启慢查询日志,并设置阙值,比如执行超过5s的就是慢查询,并把它抓取出来

3.explain+慢sql分析

4.show profile  //查看sql在mysql服务器里的执行细节和生命周期情况

5.运维经理orDBA,进行sql数据库服务器的参数调优

3.2查询优化

3.2.1小表驱动大表:减少io连接次数,io连接也消耗性能

1)类比解释:外层次数少,内层次数多

for(i=0;i<5;...){

    for(j=0;j<1000;...){}

}

2)in和exist:exist是in的变种写法,一般用in,变种可以贴合小表驱动大表原则

select * from A where bid in (select id from B)  //先执行子查询,如果B数据量小,此时用in非常合适

select * from A where exist(select '随便' from B where B.id=A.bid)  //将主查询的数据放到子查询中做验证,先执行煮茶询,如果A中数据量小,此时用exist非常合适

3.2.2使用索引优化order by

1)mysql支持两种方式的排序,index和filesort;index效率高,它指mysql扫描索引完成排序;filesort效率低

2)order by 满足两种情况,使用index排序:index_abc:(a, b, c)

a)order by 后的字段遵循最左匹配原则

select * from table where a>'aa' order by a,b,c;  //using index,order by遵循最左匹配

select * from table where a>'aa' order by c,b;  //using filesort,order by不遵循最左匹配

b)where 与order by条件列组合满足最左匹配原则

select * from table where a='aa' order by b,c;  //using index,where与order by组合遵循最左匹配

select * from table where a>'aa' order by b,c;  //using filesort

select * from table where a='aa' and b='bb' order by c;  //using index

select * from table where a='aa' and b>'bb' order by b,c;  //using index,where里面b>,但是order by续上了,也行


3.2.2使用索引优化group by

group by实质是先排序后分组,适用于order by的以上原则,同样适用于group by

3.2.3慢查询日志


1)默认关闭,需要主动开启,开启慢查询日志会消耗数据库性能

2)可以使用分析工具

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容