表优化

1、单表优化

建立索引

  1. 根据sql的实际解析顺序建立复合索引
  2. 最佳左前缀,保持索引的定义和使用顺序一致

2、多表优化

连接查询

  1. 小表驱动大表:对于双层循环来说,外层循环(数据量)越小,内层循环(数据量)越大,程序性能越高。一般左外连接左表为驱动表,右外连接右表为驱动表,内连接选结果集小的为驱动表。
  2. 索引建立在经常使用的字段上,给被驱动表建立索引
  3. 一般我们将小表当做驱动表(指定了联接条件时,满足查询条件的记录数少表为「驱动表」,未指定联接条件时,行数少的表为「驱动表」)

3、避免索引失效原则

  1. 复合索引,不要跨列或无序使用(最佳左前缀),左边失效右边全部失效。但独立索引无此影响
  2. 复合索引,尽量使用全索引匹配
  3. 复合索引,不能使用不等于(!= <>)或 is null(is not null),否则自身及右侧索引全部失效。独立索引也会失效
  4. 复合索引,一般而言,范围查询( > < in),之后的索引会失效
  5. 不要在索引上进行任何操作(计算、函数、类型转换),否则索引失效
  6. 尽量使用索引覆盖(using index)
  7. like尽量以“常量”开头,不要以“%”开头,否则索引失效
  8. 尽量不要使用or,否则索引失效
  9. 强制使用索引:select * from tabname force index(index_name) where ……
  10. 强制不使用索引:select * from tabname ignore index(index_name) where ……
  11. exists和in的使用,子查询数据集大用exists,主查询数据集大用in
  12. 尽量不要使用 select * ……

4、order by 优化

  1. 双路排序,需要两次IO,先去排序字段进行排序,然后再根据主键查找selet 字段;
  2. 单路排序,把所有字段都读取到sort buffer里面,如果sort buffer(内存)不够大,就会使用到文件排序(磁盘),另外,也只用所有列的总长度小于max_length_for_sort_data时,才会使用单路排序,否则会自动转为双路排序。
  3. 尽量保证排序的一致性(都是升序或降序)
  4. 双路排序:

    读取行指针和order by列,对他们进行排序,然后扫描已经排序好的列表,按照列表中的值重新从列表中读取对应的数据输出。

    双路排序的开销可能会非常巨大,因为他会读取表两次,第二次读取会引发大量的随机IO,对于myisam来说,这个代价尤其昂贵,myisam表利用系统调用去提取每行的数据。
  5. 单路排序:

    读取查询需要的所有列,按照order by 列对他们进行排序,然后扫描排序后的列表进行输出,它的效率更快一些,避免了第二次读取数据。并且把随机IO变成了顺序IO,但是它会使用更多的空间,因为它把每一行都保存在内存中了。

5、IN 和Exists的适用场景

  • IN查询在内部表和外部表上都可以使用到索引;
  • Exists查询仅在内部表上可以使用到索引;
  • 当子查询结果集很大,而外部表较小的时候,Exists的Block Nested Loop(Block 嵌套循环)的作用开始显现,并弥补外部表无法用到索引的缺陷,查询效率会优于IN。
  • 当子查询结果集较小,而外部表很大的时候,Exists的Block嵌套循环优化效果不明显,IN 的外表索引优势占主要作用,此时IN的查询效率会优于Exists。
  • 网上的说法不准确,即表的规模不是看内部表和外部表,而是外部表和子查询结果集。

1.mysql表优化和避免索引失效原则的更多相关文章

  1. SQL优化 MySQL版 - 避免索引失效原则(一)

    避免索引失效原则(一) 精力有限,剩余的失效原则将会在 <避免索引失效原则(二)>中连载出来,请谅解 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 避免索引失效的一些原 ...

  2. SQL优化 MySQL版 - 避免索引失效原则(二)

    避免索引失效原则(二) 注:继上一篇文章继续讲解: 避免索引失效原则(一)https://www.cnblogs.com/StanleyBlogs/p/10482048.html#4195062 作者 ...

  3. MySQL性能优化(三):索引

    原文:MySQL性能优化(三):索引 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbi ...

  4. MySQL优化之避免索引失效的方法

    在上一篇文章中,通过分析执行计划的字段说明,大体说了一下索引优化过程中的一些注意点,那么如何才能避免索引失效呢?本篇文章将来讨论这个问题. 避免索引失效的常见方法 1.对于复合索引的使用,应按照索引建 ...

  5. java面试题之----mysql表优化方案

    本文转载自segmentfault,原文链接:https://segmentfault.com/a/1190000006158186. 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考 ...

  6. 《MySQL面试小抄》索引失效场景验证

    我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点!!! 本期主要面试考点 面试官考点之什么情况下会索 ...

  7. sql优化策略之索引失效情况二

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp63   接第一篇索引失效分析:http://grefr.iteye.co ...

  8. Mysql在InnoDB引擎下索引失效行级锁变表锁案例

    先做好准备,创建InnoDB引擎数据表,并添加了相应的索引 DROP TABLE IF EXISTS `innodb_lock`; CREATE TABLE `innodb_lock` ( `a` ) ...

  9. MySQL SQL优化之字符串索引隐式转换

    之前有用户很不解:SQL语句非常简单,就是select * from test_1 where user_id=1 这种类型,而且user_id上已经建立索引了,怎么还是查询很慢? test_1的表结 ...

随机推荐

  1. Docsify+腾讯云对象存储 COS,一键搭建云上静态博客

    最近一直在想如何利用 COS 简化静态博客的搭建过程.搜了很多的静态博客搭建过程,发现大部分的静态博客都要通过编译才能生成静态页面.功夫不负有心人,终于让我找到了一个超简洁博客的搭建方法. 效果预览 ...

  2. 如何使用TradingView(TV)回测数字货币交易策略

    更多精彩内容,欢迎关注公众号:数量技术宅.想要获取本期分享的完整策略代码,请加技术宅微信:sljsz01 TradingView平台简介 前段时间,有粉丝找到技术宅,表示他有一个常用的交易平台,叫做T ...

  3. arcgis性能检测记录

    参考了一下文章,先记录下: http://www.mamicode.com/info-detail-1973690.html https://wenku.baidu.com/view/140c4880 ...

  4. vm虚拟机安装centos7。克隆镜像以及快照

    为了方便下次安装配置,保存一篇安装centos的文章 https://blog.csdn.net/wsq119/article/details/80635558 步骤非常详细,一看就会. 这一篇是关于 ...

  5. 从内存泄露、内存溢出和堆外内存,JVM优化参数配置参数

    内存泄漏 内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费.内存泄漏最终会导致OOM. 造成内存泄漏 ...

  6. 第4.4节 Python解析与推导:列表解析、字典解析、集合解析

    一.    引言 经过前几个章节的介绍,终于把与列表解析的前置内容介绍完了,本节老猿将列表解析.字典解析.集合解析进行统一的介绍. 前面章节老猿好几次说到了要介绍列表解析,但老猿认为涉及知识层面比较多 ...

  7. 音视频处理基础知识扫盲:数字视频YUV像素表示法以及视频帧和编解码概念介绍

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ...

  8. 解读 authentication.py

    """ Provides various authentication policies. """ import base64 import ...

  9. Panda Global发现,FATF关于区块链金融又发声

    众所周知,FATF是一个由G7成员国在1989年在法国巴黎所成立的,具有国际反洗钱和反恐融资领域最具权威性的国际组织,全称叫金融行动特别工作组.2007年,中国而加入了该组织,迄今为止FATF成员已涵 ...

  10. 美国SEC主席离任,Panda Global 前瞻数字资产监管政策变化

    在上上个周末,也就是6月20号,美国的证券行业发生了一件值得反复回味的的事情--美国SEC现任主席Jay Clayton宣布即将离任,对于数字资产行业而言,未来监管政策将如何演变突然有了无限的遐想空间 ...