mysql使用心得,如何在增删改查的基础上使sql运行的更快

  • 前提:使用explain分析sql语句
    例:分析左右连接查询的sql
    使用join 默认是左连接,
    左边使用的是all右使用的是eq_ref

使用left join 左边使用的是all右使用的是eq_ref,换一种更容易理解的说法:left 左表为驱动表(适合左表较小的情况)

使用right join 右边使用的是all左边使用的是all,为什么左边一定是全表扫呢? 存疑

左连接,左边表里的数据全查出,右边未找到对应的显示为null


  • 可以达到优化效果的写法和原因

mysql中:
插入数据时,对于有默认值的字段只在插入值和默认值不同时才显式插入,避免插入时的参数校验

避免使用sql本身的自增,因为会涉及主键冲突,需要额外的保证不会冲突,影响插入效率

大量数据入库的优化: 如果唯一约束确定唯一,或者可以容忍插入后再去除重复项,唯一约束在load file前的关闭和load后的开启

insert优化: 批量插入减少连接消耗,多客户端插入设置即时执行?(在内存中执行,而无需等待其他客户端读写完成)

order by 优化: 使用index(表现为explain中extra为index而不是filesort),where条件和order by条件保持一致,多个条件order by的写法和desc或者asc保持一致(达到重用的目的)

group by 优化: 如果不需要排序操作,可以取消默认的排序操作(order by null)

filesort 优化: 修改sort_buffer_size参数使排序尽量在内存中完成

嵌套查询优化: 使用join代替(不需要创建临时表?逻辑更简洁)

or 优化: or条件都使用index(本质是按or条件查询后做union),如何处理联合索引(当or一边的条件只使用了符合索引的一部分则=没用索引;如果or一边使用的是全部的符合索引呢?)

分页优化: 使用index分页后 再回表查询

like 查询时使用%,尽量保证左边为确定的字符如 ‘nam%’,减少正则匹配,正则用的不好反而是一大隐患
like优化,牺牲空间换取时间 使用全文索引使模糊查询更快

慎用 not in 效率和易读性,not in <not exists <join…

between 和in:当范围为连续的值between优于in

小表驱动大表:
① in和exists:exist外表为驱动表(执行顺序为外表先解析,适合外表小嵌套查询的内表大的情况),in为in()中的查询语句先执行,适合嵌套查询的表小的情况
例:select x from A in(select x from B) 当B小于A时优于exists
② inner join 优于left/right join inner默认取小表驱动

where中慎用 null判断,计算 引擎会放弃使用索引(ps:is null 和== null 不是一回事)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值