MySQL优化

优化手段金字塔模型

MySQL优化的方法

优化手段从底层往上,成本越高,但效果却越低。加硬件是成本最高,但效果却最低。sql语句的优化、索引的正确使用以及优化,是成本最低的方式,但往往却是效果最高的一种方式。

联合索引优化

最左前缀原则

联合索引优化中有一个口诀:带头大哥不能死,中间兄弟不能断。比方说现在有联合索引:name、age、sex。想要这个索引生效,name字段必须使用,如果没有使用到name,则此索引必不生效。原因是:想要一个索引生效,首先的前提是:保证B+树的有序,但当联合索引中没有用到name时,后面的字段无法保证其顺序,因此得扫描全表,故而无法使用索引。而当使用到了name时,保证了其字段的数据是有序的了,但后面的字段的数据仍然无序,所以,想要完全发挥联合索引的最高性能时,应该是查:name/age/sex、name/age,假设只需要查询name和sex时,应该查:name/age/sex或者调整联合索引为:name、sex、age。

索引列上少计算数

在查询的时候,索引列上尽可能少进行计算,比如:select * from user where left(name,3) = '张三'。此时索引是不生效的,可以考虑使用like进行模糊查询,改成:select * from user where name like '张三%'。此时会使用范围索引。查询时间时使用函数:date(create_time) = '2023-07-01'时也同理,B+树查找的时候每个叶子节点都需要进行运算,故而需要扫描全表。而使用范围时:create_time >= '2023-07-01 00:00:00' and create_time <= '2023-07-01 23:59:59'时,可以使用到范围索引。因为B+树中可以寻找到最小的具体值,然后根据有序的原则,找到与之关联的范围数据,故而不需要全表扫描,即:

保证B+树的有序性,不要在索引列上做任何操作(计算、函数、类型转换),否则会导致索引失效而转向扫描全表

范围后面全失效

仍然是保证B+树的有序的问题,当使用范围查询的时候,是无法保证后续数据的有序的,因而后面的字段索引会失效,如果是最左的字段就使用范围查询时,会导致索引失效而转向全表扫描。

覆盖索引不使用*

select 后面不跟*而是跟着联合索引的字段时,不需要通过回表即可得到全部数据,效率自然会更高

不等于、空值、or

这三种情况很大几率是扫描全表的,但是可能能匹配上某些索引,但经过mysql底层评估,最终可能还是进行了全表扫描,此时可以使用force index (索引名)来手动使用索引

like百分号写最右

在使用like模糊查询的时候,应该尽量把百分号写在最右边,因为B+树进行检索的时候,如果第一个字都不能确定,那将要进行全表的扫描。

varchar类型的引号不可以丢

当索引字段类型是varchar类型的时候,引号如果不写,也会导致索引失效而转向扫描全表

SQL优化

尽量避免使用select *
  • 查询时需要将*转化为对应的字段,增加查询解析器的成本
  • select * 查询一般不走覆盖所有会产生大量的回表查询
  • 实际使用中,我们往往只需要几个字段的数据,将全部数据查出来空耗CPU、内存资源
小表驱动大表

通过数据量较小、索引比较完备的表,然后使用其索引和条件对大数量的表进行筛选,从而减少计算量,提高查询效率。

提升group by的效率
  • 创建索引:如果使用的group by的列没有索引,那么查询可能会变慢。因此,可以创建一个或多个合适的索引来提速
  • 调整查询:查询的写法也会影响group by的效率。可以尝试不适用子查询或临时表,或者使用join或exists来代替in子查询
批量操作

当需要批量新增或修改或删除的时候,不应该考虑遍历一条条进行处理,mysql中提供了批量操作的方式

使用limit

查询部分数据,可以通过limit来限制查询的结果,常见于分页查询。使用limit可以提高查询性能、减少需要处理的时间,并且只返回我们所关心的行 。

百万行级别数量的数据表limit越来越慢怎么办?

首先mysql是怎么处理limit的呢?比方说:select * from user limit 100000,10
这个时候mysql会从第一条开始找,一条条进行查找,直到找到第100000+10条数据
然后,抛弃掉前面的100000条
最后,返回剩下的10条数据

很显然,这种一条条寻找的办法是很损耗性能的,我们应该想办法帮它规避掉这部分的操作,优化方法:

  • 利用自增id直接定位最开始的数据
select * from user where id >= 100000 limit 10
  • 先找出所需数据的索引列,然后通过索引列找到对应的数据
select * from user where id in (select id from user where name = '张三' ) limit 100000,10
  • 因为使用了in,范围太大可能会导致全表扫描,因此还可以进行二次优化,改用 inner join
select * from user inner join(select id from user where name = '张三'  limit 0,10) b using (id)
使用union all 代替 union

union all:获取所有数据但不去重,包含重复数据
union:获取所有数据且去重,不包含重复数据

如果业务数据容许出现重复数据,则更推荐union all,因为union去重要遍历、排序、比较。它更耗时,且耗费CPU资源,但去重后的结果最精准。

join的表不宜过多

数据表设计的时候,应该尽量减少join操作的使用,简化表之间的关系,以提高查询效率和系统的性能。

总结

1.减少数据扫描
2.返回更少的数据
3.减少交互次数
4.减少服务器CPU和内存开销

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

推荐阅读更多精彩内容