• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL查询优化必备知识点总结

    前言

    查询优化本就不是一蹴而就的,需要学会使用对应的工具、借鉴别人的经验来对SQL进行优化,并且提升自己。

    先来巩固一下索引的优点,检索数据快、查询稳定、存储具有顺序性避免服务器建立临时表、将随机的I/O变为有序的I/O。

    但索引一旦创建的不规范就会造成以下问题,占用额外空间,浪费内存,降低数据的增、删、改性能。

    所以只有在理解索引数据结构的基础上才能创建出高效的索引。

    **本文所有操作均在MySQL8.0.12**

    一、创建索引规范

    在学习索引优化之前,需要对创建索引的规范有一定的了解,此规范来自于阿里巴巴开发手册。

    主键索引:pk_column_column

    唯一索引:uk_column_column

    普通索引:idx_column_column

    二、索引失效原因

    创建索引需知道在什么情况下索引会失效,只有了解索引失效的原因,在创建索引时才不会出现一些已知错误。

    1.带头大哥不能死

    这局经典的语句就是涵盖创建索引时一定要符合最左侧原则。

    例如表结构为 u_id,u_name,u_age,u_sex,u_phone,u_time

    创建索引为 idx_user_name_age_sex

    查询条件必须带上u_name这一列。

    2.不在索引列上做任何操作

    不在索引列上做任何计算、函数、自动或者手动的类型转换,否则会进行全表扫描。简而言之不要在索引列上做任何操作。

    3.俩边类型不等

    例如建立了索引idx_user_name,name字段类型为varchar

    在查询时使用where name = kaka,这样的查询方式会直接造成索引失效。

    正确的用法为where name = "kaka"

    4.不适当的like查询会导致索引失效

    创建索引为idx_user_name

    执行语句为select * from user where name like "kaka%";可以命中索引。

    执行语句为select name from user where name like "%kaka";可以使用到索引(仅在8.0以上版本)。

    执行语句为select * from user where name like ''%kaka";会直接导致索引失效

    5.范围条件之后的索引会失效

    创建索引为idx_user_name_age_sex

    执行语句select * from user where name = 'kaka' and age > 11 and sex = 1;

    上面这条sql语句只会命中name和age索引,sex索引会失效。

    复合索引失效需要查看key_len的长度即可。

    总结:%在后边会命令索引,当使用了覆盖索引时任何查询方式都可命中索引。

    以上就是咔咔关于索引失效会出现的原因总结,在很多文章中没有标注MySQL版本,所以你有可能会看到is null 、or索引会失效的结论。

    三、SQL优化杀手锏之 Explain

    在写完SQL语句之后必须要做的一件事情就是使用Explain进行SQL语句检测,看是否命中索引。

    下图就是使用explain输出格式,接下来将会对输出格式进行简单的解释。

    1.id 这列就是查询的编号,如果查询语句中没有子查询或者联合查询这个标识就一直是1。

    如存在子查询或者联合查询这个编号会自增。

    2.select_type

    最常见的类型就是SIMPLE和PRIMARY,此列知道就行了。

    3.table

    理解为表名即可

    4. **type

    此列是在优化SQL语句时最需要关注的列之一,此列显示了查询使用了何种类型。

    以下排序从最优到最差。

    5.possible_keys

    此列显示的可能会使用到的索引

    6. **key

    优化器从possible_keys中命中的索引

    7.key_len

    查询用到的索引长度(字节数),key_len只计算where条件用到的索引长度,而排序和分组就算用到了索引,也不会计算到key_len中。

    8.ref

    如果是使用的常数等值查询,这里会显示const。

    如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段。

    如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func。

    9. **rows

    这是mysql估算的需要扫描的行数(不是精确值)。

    这个值非常直观显示 SQL 的效率好坏, 原则上 rows 越少越好。

    10.filtered

    此列表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数

    11. **extra

    在大多数情况下会出现以下几种情况。

    12.总结

    以上就是关于Explain所有列的说明,在平时开发的过程中,一般只会关注type、key、rows、extra这四列。

    四、SQL优化杀手锏之 慢查询

    上文说到了可以直接使用explain来分析自己的SQL语句是否合理,接下来再聊一个点那就是慢查询。

    查看慢查询是否打开

    查看是否记录没有使用索引的SQL语句

    开启慢查询、开启记录没有使用到索引的SQL语句

    set global log_queries_not_using_idnexes='on';
    
    set global log_queries_not_using_indexes='on';
    

    查询以上俩个配置是否打开

    设置慢查询时间,这个时间由自己把控,一般1s即可 set globle long_query_time=1;

    如果查看这个时间没有变,则关于客户端在重新连接一次即可。

    查看慢查询存储位置

    然后随便执行一条不执行索引的语句即可在这个日志中查看到此语句

    上图中一般需要主要观察的是Query_time、SQL语句内容。

    以上就是关于如何使用慢查询来查看项目中出现问题的SQL语句。

    五、优化大法

    此处跟大家聊一些常用的SQL语句优化方案,以上的俩个工具要好好的利用,辅助我们进行打怪。

    六、总结

    到此这篇关于MySQL查询优化必备知识点的文章就介绍到这了,更多相关MySQL查询优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • MySQL百万级数据分页查询优化方案
    • MySQL 使用自定义变量进行查询优化
    • 理解MySQL查询优化处理过程
    • mysql查询优化之100万条数据的一张表优化方案
    • 详解MySQL 联合查询优化机制
    • MySQL查询优化之查询慢原因和解决技巧
    • MySQL之select in 子查询优化的实现
    • MySQL千万级大数据SQL查询优化知识点总结
    • Mysql慢查询优化方法及优化原则
    • 通过MySQL慢查询优化MySQL性能的方法讲解
    • MySQL 百万级数据的4种查询优化方式
    上一篇:SQL中EXPLAIN命令的使用方法
    下一篇:mysql高级学习之索引的优劣势及规则使用
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL查询优化必备知识点总结 MySQL,查询,优化,必备,知识点,