数据库调优步骤:

1)首先查看慢查询日志,找到有问题的 sql 语句   2)利用 explain 查看各个属性的状态   3)利用 show profile  4)查看数据库内部各个关键节点的配置

1、索引是排好序的能够实现快速查找的数据结构,因此对于复合索引来说,mysql会根据创建索引的顺序对数据库表进行排序,因此如果某个sql语句没有按照创建索引的顺序操作字段的话,索引的使用情况必然受到影响,比如创建复合索引 abc,其中 b 没用上,那么本来根据 b 排好序的后面的排序同样也就失效了。索引是存储在磁盘上的一种文件,是和数据库表在物理上分开而逻辑上相连的一种数据结构

where 后跟的是查询条件,order by 后面跟的是排序条件,一般都会在这两者身上用索引,而且这两者都遵循最佳左前缀法则

mysql 支持两种排序方式:1)using index ;2)using filesort,当然要尽量避免后者,尽可能多的使用前者

2、B树不一定都是二叉树,而叫多路搜索树,大多数是B树索引,也有hash索引等其他的索引

3、索引分为:单值索引、唯一索引和复合索引,唯一索引只是加在索引上的一种限制,比如某一个列被
创建成了索引,而且加上了唯一索引的限制(UNIQUE),那么该索引列上的所有的值必须不能重复,都是

唯一的,如果不加唯一索引限制,是可以重复的

4、索引缺点:1、索引也是一张表,占用磁盘空间  2、加上索引提高了数据的搜索速度,但是减慢了
数据的增删改的速度,因为一旦数据表中的数据发生变化,如果变化的列恰好也是索引列,那相应的索引
也要发生更改

5、经常更新的字段不要建索引,重复率太高的字段不要建索引,可以用一个公式来衡量一个列创建索引的选择性:一个列中不同值的数量/该列总记录的数量

6、mysql 是怎么优化的?

执行 EXPLAIN 关键字 + SQL 语句得到:

id   select_type    table    possible_keys     key      key_len     ref     rows     Extra

7、要么别建索引,如果建索引,则group by 的顺序一定要和建索引的顺序相同,来避免产生:Extra 属性里面出现:using filesort 和 using temporary,特别是不要出现后者

8、在范围索引后面的索引是不起作用的(失效索引)

9、左连接的时候,在右表创建索引,右连接的时候,在左表创建索引,如:
select * from employee LEFT JOIN dept on employee.deptID = dept.id

(员工表的部门 ID 等于部门表的主键 ID)这是一个左连接,employee 当做左表,dept 当做右表,所以需要在 dept 上创建索引如:alter table ‘dept’ ADD INDEX Y ('id')

10、索引最好建立在需要经常查询的字段中,对于JOIN 的优化,永远用小表驱动大表,也就是小表要在左边,大表在右边

11、优先优化内层子查询,也就是带括号的查询,只有内层查询快了,外层查询才能加速

12、如果用 explain 解析的 sql 语句的 key 属性值为 NULL,则有两种可能,一种是没创建索引第二是虽然创建了索引,但是索引失效

13、对于复合索引(一个表中同时建立的多个索引,如:create INDEX abc on Employee(a,b,c)),口诀是:
带头大哥不能倒:意思就是按索引创建的顺序,第一个被创建的索引列必须要用上,否则后面的索引不论怎么组合或者单独使用都是无效(也叫做最佳左前缀法则)
中间兄弟不能断:意思是不能隔空只用,比如没有用到中间的 b,而是使用的 a 和 c,则 c 索引失效,a 可以正常使用

14、范围之后全失效,比如:
select * from Employee Where name=July AND age>25 AND position=manager
这个 sql 中用到了 age>25 这个范围,所以 mysql 就会在这个索引层进行查找,后面的 position就失效了

15、尽量在索引列内做查询,少用 select *,比如可以用: 
select a,b from Employee Where name=July AND age>25 AND position=manager

16、当使用不等于符号(!=或者<>)或者is NULL,或者 is not NULL的时候,会导致索引失效,全表扫描

****覆盖索引:查询的时候,选择的查询字段与创建复合索引的字段的名称相同,如果在查询的时候,查询字段的顺序和创建覆盖索引的顺序不一样,索引也能够正常使用,由于在 mysql 架构的第二层有一个优化器,会自动把顺序调整过来,所以一般要按照创建复合索引的顺序写查询字段,避免了一次数据库内部优化的过程,比如:

create INDEX abcd on Employee(a,b,c,d);

select   a,b,c,d   from Employee Where a=1,b=2,c=2,d=0 和 select    a,b,c,d    from Employee Where a=1,b=2,d=0,c=2

这两条 sql 的 explain 结果是相同的,只是第二条 sql 在 mysql 内部做了一次优化,先把 Where 后面的顺序根据创建复合索引的顺序排好

17、like 查询最好把 % 加在右边:百分like加右边,而且查询的explain 属性 type 值为 range ,否则,加在左边或者两边都加,索引会失效,如果非要在两边加 % 才能保证数据的准确性,则需要创建覆盖索引才能达到索引不失效,所谓覆盖索引,也就是查询的时候,选择的查询字段与创建复合索引的字段的名称相同,当然选择复合索引的其中某几个作为查询字段,索引也不会失效,但是如果是 select * 或者是查询的字段中包含非复合索引字段,则创建的复合索引会失效,比如:
create INDEX abc on Employee (a,b,c);
select a,b,d from Employee Where name like %aa%;
其中 d 字段不是复合索引中的字段,因此该查询仍然是全表扫描,索引失效

18、字符串不加单引号索引会失效,比如:
select * from Employee Where name='2000',该 sql 的索引不会失效,但是如果2000上不加单引号,虽然能够查到结果,(mysql 在内部做了一个隐式的转换,把int型转为 string 型),但是索引会失效

19、少用 or,用 or 也会导致索引失效

20、使用 order by 防止索引失效和防止产生 filesort 的方法,提高 order by 的速度:

21、最佳左前缀法则

mysql 写出高性能sql 防止索引失效总结相关推荐

  1. 如何写出高性能SQL语句

    1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条 ...

  2. Sql Server 优化 SQL 查询:如何写出高性能SQL语句

    1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条 ...

  3. 优化SQL查询:如何写出高性能SQL语句

    2019独角兽企业重金招聘Python工程师标准>>> 2. 统一SQL语句的写法 对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的. select*from ...

  4. 如何写出高性能的SQL语句,及如何进行SQL性能分析与调优

    1.尽量使用索引 索引是数据库中重要的存储结构,对于查询耗时影响甚大,应避免导致索引无效的sql语句 索引失效的场景: 1.缺失索引 2.where 条件中的or 3.where条件表字段使用函数 4 ...

  5. mysql优化说出九条_技术分享 | MySQL 优化:为什么 SQL 走索引还那么慢?

    原标题:技术分享 | MySQL 优化:为什么 SQL 走索引还那么慢? 背景 2019-01-11 9:00-10:00 一个 MySQL 数据库把 CPU 打满了. 硬件配置:256G 内存,48 ...

  6. 如何写出高性能代码(四)优化数据访问

      同一份逻辑,不同人的实现的代码性能会出现数量级的差异: 同一份代码,你可能微调几个字符或者某行代码的顺序,就会有数倍的性能提升:同一份代码,也可能在不同处理器上运行也会有几倍的性能差异:十倍程序员 ...

  7. Mysql复习计划(四)- 索引失效和数据库设计规范

    Mysql复习计划(四)- 索引失效和数据库设计规范 一. 索引失效 1.1 数据准备 1.2 最左匹配原则 1.3 计算.函数.类型转换导致索引失效 1.4 范围条件右侧的列索引失效 1.5 不等于 ...

  8. 三周写出高性能的Python代码,这些小技巧你值得一试。

    1一个不上进的 Python 使用者 我是一个有 C 语言背景的开发者.最近转做了 Python,平时用 Python 还算 6,这周在给新员工分享工作之后,有个小孩跑来问我:"哥,你是学 ...

  9. mysql join 索引 无效_ORACLE MYSQL中join 字段类型不同索引失效的情况-阿里云开发者社区...

    ORACLE MYSQL中join 字段类型不同索引失效的情况 重庆八怪 2016-12-29 780浏览量 简介: 关于JOIN使用不同类型的字段类型,数据库可能进行隐士转换,MYSQL ORACL ...

  10. code blocks代码性能分析_Julia系列教程13--如果写出高性能的Julia代码

    避免全局变量https://www.zhihu.com/video/1113506985873588224 code generationhttps://www.zhihu.com/video/111 ...

最新文章

  1. 2021年大数据常用语言Scala(二十六):函数式编程 分组 groupBy
  2. python绝技 — 侦听802.11 Probe请求
  3. nivicat复制mysql数据库[Err] [Dtf] 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'错误
  4. C++ #pragma comment语法(预处理指令)
  5. NOIP信息奥赛--1995“同创杯”初中复赛题题解(三)
  6. 飞桨上线万能转换小工具,教你玩转TensorFlow、Caffe等模型迁移
  7. PHP 入门 - 8.数据库
  8. Android Bitmap OutOfMemory 解决的方法
  9. Linux shell sed awk
  10. 使用echarts(二)自定义图表折线图
  11. 如何制作一个横版格斗过关游戏(2) Cocos2d-x 2.0.4 .
  12. BZOJ4817 [SDOI2017]树点涂色
  13. 总结ASP操作文件夹和文件
  14. 园林景观cad_1000个CAD平面设计素材模板图,绘图任意用,全部打包带走
  15. 2021-09-10 QTdesigner 介绍入门 布局
  16. 科学计算机后盖换电池,图吧小白教程 篇二十二:手把手教你给手机换电池(拆机)...
  17. c语言编程符号函数sgn,在C/C中是否有标准符号函数(signum,sgn)?
  18. 工作自动扩张的时间管理与柳比歇夫时间记录统计(时间管理讲座笔记)
  19. html中td 的值不换行符,解决英文字母在td标签中不换行的问题
  20. github如何合并分支

热门文章

  1. 杭电acm2030汉字统计
  2. Maven的Scored介绍
  3. 一个在线排版小工具:中文、英文、数字、符号中间加个空格
  4. Centos7.4 下cobbler安装及配置
  5. (转)Linux 系统性能分析工具图解读(一、二)
  6. Python与数据挖掘学习笔记(1)——Pandas模块
  7. JPA Example查询
  8. 浏览器URL传参最大长度问题
  9. Silverlight中无法设置卫星程序集为中立资源程序集
  10. php加速 PHP APC 浅析