• 索引失效情况:

    • 最佳左前缀法则:如果索引了多列,要遵循最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中的列;【覆盖索引有a,b,c,条件中使用了b或bc都导致该索引失效;如果条件使用了ac,导致部分索引生效,只使用了a】【索引开头第一个不能去掉,中间部分不能断】
    • 不在索引列上做任何操作(计算、函数、(自动或手动)类型转换),会导致索引失效而进行全表扫描;【where条件的字段不做任何操作,否则导致索引失效】
    • 存储引擎不能使用索引中范围条件右边的列;【覆盖索引有a,b,c,a是常量,b是范围,导致索引用到了a,b,后面的c失效】
    • 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *;

    • MySQL在使用不等于(!=或<>)的时候无法使用索引会导致全表扫描;
    • is null和is not null无法使用索引;
    • like以通配符开头('%abc...'或'%abc'),MySQL索引失效导致全表扫描;【'abc...%'不会导致索引失效】【解决方法:使用覆盖索引来解决,即对select的字段创建索引】【id是主键,默认创建索引】

      下面的SQL索引失效【使用*或多了字段】:

    • 字符串不加单引号导致索引失效;【例如name是varchar类型,条件where name=1做了隐形类型转换,还会导致索引失效,降低MySQL性能】
    • 少用or,用它来连接会导致索引失效;
    • 总结:
  • 查询优化:
    • 小表驱动大表:小的数据集驱动大的数据集

      1.当B表的数据集必须小于A表的数据集时,用in优于exists
      select * from A where id in (select id from B)
      等价
      for select id from B
      for select *from A where A.id=B.id
      2.当A表的数据集小于B表的数据集时,用exists优于in
      select *from A where exists (select 1 from B where B.id=A.id);
      等价
      for select *from A
      for select *from B where B.id=A.id
      • exists:select ...from table where exists(subquery) 将主查询的数据,放到子查询中做条件判断,根据验证结果true或false来决定主查询的数据结果是否可以保留;

        • exists(subquery)只返回true或false,因此子查询中的select *可以是select 1或其他,因为在实际执行时会忽略select清单;
        • exists子查询可以用条件表达式、其他子查询或join;
    • order by关键字优化:文件排序、扫描有序索引排序两种方式;
      建立索引:key abc(a,b,c)
      order by使用索引最左前缀原则:(有序索引排序,using index)
      --order by a
      --order by a,b
      --order by a,b,c
      --order by a desc,b desc,c desc(升降序一致)
      如果where使用索引的最左前缀定义为常量,则使用索引且是有序索引排序(using index):
      --where a=const order by b,c
      --where a=const and b=const order by c
      --where a=const and b>const order by b,c
      产生文件排序(using filesort):
      --order by b(非最左前缀)
      --order by b,a(顺序颠倒)
      --order by a asc,b desc,c desc (排序不一致)
      --where d=const order by b,c (a丢失)
      --where a=const order by c(b丢失)
      --where a=const order by a,d(d不是索引的一部分)
      --where a in(..) order by b,c(范围查询)
    • group by关键字优化:group by实质是先排序后进行分组,遵照索引的最左前缀原则;当无法使用索引列时,增大max_length_for_sort_data参数的设置和增大sort_buffer_size参数的设置;where高于having,能写在where限定的条件就不要去having限定;
  • 慢查询日志的配置:
    在my.cnf文件中[mysqld]增加或修改参数:
    slow_query_log=1
    slow_query_log_file=/文件存储路径/fileName.log【若没有指定,系统默认给一个指定的文件host_name-slow.log】
    查看达到写入慢查询日志的阀值:SHOW VARIABLES LIKE 'long_query_time%';【默认情况下为10秒,即查询时间大于10秒的sql会记录到日志中】
    设置阀值:set global long_query_time=数值;【设置结束后需要新开一个会话或重新连接才看见修改信息,或使用show global variables like 'long_query_time'查看】
    查看当前系统的慢查询SQL总条数:show global status like '%Slow_queries%';

MySQL笔记(4)-- 索引优化的更多相关文章

  1. MySQL中的索引优化

    MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 过多的使用索引将会造成滥用.因此索引也会有它的缺点.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 ...

  2. MySql在建立索引优化时需要注意的问题

    MySql在建立索引优化时需要注意的问题 设计好MySql的索引可以让你的数据库飞起来,大大的提高数据库效率.设计MySql索引的时候有一下几点注意: 1,创建索引 对于查询占主要的应用来说,索引显得 ...

  3. MySQL如何利用索引优化ORDER BY排序语句

    MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通 ...

  4. MySQL如何利用索引优化ORDER BY排序语句 【转载】

    本文转载自:http://blog.csdn.net/ryb7899/article/details/5580624  .感谢相关作者. MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执 ...

  5. MySQL笔记(5)---索引与算法

    1.前言 本章记录MySQL中的索引机制,了解索引可以让数据库更快.索引太多会造成性能损耗,索引太少肯定查询效率不高. 2.InnoDB存储引擎所有概述 InnoDB中常见的索引有: B+树索引 全文 ...

  6. MySQL 多列索引优化小记

    MySQL 5.6.30 问题背景 由于爬虫抓取的数据不断增多,这两天在不断对数据库以及查询语句进行优化,其中一个表结构如下: CREATE TABLE `newspaper_article` ( ` ...

  7. MySQL如何利用索引优化ORDER BY排序语

    MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通 ...

  8. MySQL系列(六)--索引优化

    在进行数据库查询的时候,索引是非常重要的,当然前提是达到一定的数据量.索引就像字典一样,通过偏旁部首来快速定位,而不是一页页 的慢慢找. 索引依赖存储引擎层实现,所以支持的索引类型和存储引擎相关,同一 ...

  9. mysql 单表索引优化

    建表语句 CREATE TABLE IF NOT EXISTS `article` ( `id` INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMEN ...

  10. 【MySQL 高级】索引优化分析

    MySQL高级 索引优化分析 SQL 的效率问题 出现性能下降,SQL 执行慢,执行时间长,等待时间长等情况,可能的原因有: 查询语句写的不好 索引失效 单值索引:在 user 表中给 name 属性 ...

随机推荐

  1. 如何快速找出Linux中的重复文件

    md5sum | sort | uniq -w32 --all-repeated=separate [1]find -not -empty -type f -printf “%s\n” :find是查 ...

  2. 一下午简单写个搭建Flutter开发环境,dome跑起来!

    1.下载flutter包由于需要翻墙,国内下载会出现问题,所有需要先配置一下用户环境变量. export PUB_HOSTED_URL=https://pub.flutter-io.cn export ...

  3. 暑假集训第六周contest1

    51Nod - 1413 权势二进制 题意:就是讲给出一个数n,让你求最少由多少个像0,1,10,11......这样的二进制数相加构成:样例n=9就是由9个二进制1相加组成,我不懂比赛的时候我为什么 ...

  4. JavaIO 流(1)IO流介绍

    IO流定义: 流的本质是一组单向有序,分起始和终止的数据传输过程.需要导入import java.io.* IO流分类: 按数据类型分为:字节流和字符流 字节流: 按字节进行读取(可以处理任意类型数据 ...

  5. 机器学习迁移模型到IOS

    https://paulswith.github.io/2018/02/24/%E8%BF%81%E7%A7%BB%E5%AD%A6%E4%B9%A0InceptionV3/ 上文记录了如何从一个别人 ...

  6. Windows 下 LaTeX 手动安装宏包(package)以及生成帮助文档的整套流程

    本文简单介绍如何手动安装一个 LaTeX 宏包. 一般来说,下载的 TeX 发行版已经自带了很多宏包,可以满足绝大部分需求,但是偶尔我 们也可能碰到需要使用的宏包碰巧没有安装的情况,这时我们就需要自己 ...

  7. USB小白学习之路(5) HID鼠标程序

    HID鼠标程序 1. 特别注意 需要特别注意,各个例程中的设备描述符,配置描述符等各种描述符都是已经配置好了的,我们需要做的只是在例程中将代码修改为自己需要的部分即可,一般情况下是不可以串搭配的. 2 ...

  8. 脚本化处理linux云服务器第二硬盘初始化

    #!/usr/bin/bash # 可以带参数 method=$ size=$ mydir=$ [ $#== ]&&{ echo -e "Missing parameter! ...

  9. 从0到1,本地到远程git程序过程

    从0到1,本地到远程git程序过程 切记一定要在需要提交代码的文件夹下git init,既是你使用了什么 tortoisegit什么工具,或者你在idea环境下已经add了,但是仍然需要你在当前文件夹 ...

  10. [红日安全]Web安全Day5 - 任意文件上传实战攻防

    本文由红日安全成员: MisakiKata 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目 ...