假设b=100 , 一百万个节点的树,h将只有3层 。
即,只有3次磁盘I/O就可以查找完毕,性能非常高 。
索引查询建立索引后 , 合适的查询语句才能大发挥索引的优势 。
另外,由于查询优化器可以解析客户端的sql语句,会调整sql的查询语句的条件顺序去匹配合适的索引 。
SQL优化万能公式:5 大步骤 + 10 个案例在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长,很多SQL语句开始暴露出性能问题,对生产的影响也越来越大,有时可能这些有问题的SQL就是整个系统性能的瓶颈 。
1、通过慢查日志等定位那些执行效率较低的SQL语句
2、explain 分析SQL的执行计划
type由上至下,效率越来越高
Extra
3、show profile 分析
了解SQL执行的线程的状态及消耗的时间 。默认是关闭的,开启语句“set profiling = 1;”
4、trace
trace分析优化器如何选择执行计划 , 通过trace文件能够进一步了解为什么优惠券选择A执行计划而不选择B执行计划 。
【mysql不等于怎么优化 mysql中不等于怎么表示】5、确定问题并采用相应的措施
案例1、最左匹配
索引
SQL语句
查询匹配从左往右匹配,要使用order_no走索引,必须查询条件携带shop_id或者索引(shop_id,order_no)调换前后顺序
案例2、隐式转换
索引
SQL语句
隐式转换相当于在索引上做运算 , 会让索引失效 。mobile是字符类型,使用了数字,应该使用字符串匹配,否则MySQL会用到隐式替换 , 导致索引失效 。
案例3、大分页
索引
SQL语句
对于大分页的场景 , 可以优先让产品优化需求,如果没有优化的,有如下两种优化方式,一种是把上一次的最后一条数据 , 也即上面的c传过来,然后做“cxxx”处理,但是这种一般需要改接口协议,并不一定可行 。另一种是采用延迟关联的方式进行处理,减少SQL回表,但是要记得索引需要完全覆盖才有效果,SQL改动如下
案例4、in + order by
索引
SQL语句
in查询在MySQL底层是通过n*m的方式去搜索,类似union,但是效率比union高 。in查询在进行cost代价计算时(代价 = 元组数 * IO平均值),是通过将in包含的数值,一条条去查询获取元组数的 , 因此这个计算过程会比较的慢 , 所以MySQL设置了个临界值(eq_range_index_pe_limit),5.6之后超过这个临界值后该列的cost就不参与计算了 。因此会导致执行计划选择不准确 。默认是200,即in条件超过了200个数据,会导致in的代价计算存在问题 , 可能会导致Mysql选择的索引不准确 。
处理方式 , 可以(order_status,created_at)互换前后顺序,并且调整SQL为延迟关联 。
案例5、范围查询阻断,后续字段不能走索引
索引
SQL语句
范围查询还有“IN、between”
案例6、不等于、不包含不能用到索引的快速搜索 。(可以用到ICP)
在索引上,避免使用NOT、!=、、!、NOT EXISTS、NOT IN、NOT LIKE等
案例7、优化器选择不使用索引的情况
如果要求访问的数据量很?。?则优化器还是会选择辅助索引,但是当访问的数据占整个表中数据的蛮大一部分时(一般是20%左右),优化器会选择通过聚集索引来查找数据 。
查询出所有未支付的订单,一般这种订单是很少的,即使建了索引,也没法使用索引 。
案例8、复杂查询
如果是统计某些数据,可能改用数仓进行解决;如果是业务上就有那么复杂的查询,可能就不建议继续走SQL了,而是采用其他的方式进行解决,比如使用ES等进行解决 。
推荐阅读
- flutter没有版本,flutter 版本
- 移动硬盘怎么装xp系统,怎样给移动硬盘安装操作系统
- 制作我网站,制作网站教程
- linuxoracle新建数据库,oracle创建数据库实例linux
- linux相对路径和命令 linux 相对路径
- a2 c语言数组asum,C语言数组输入输出
- 钓鱼软件下载,钓鱼软件下载安装
- 手机投屏直播软件,手机投屏电视直播软件下载
- 查看linux近期命令 linux查看之前命令