• 索引失效情况:

    • 最佳左前缀法则:如果索引了多列,要遵循最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中的列;【覆盖索引有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. HAProxy此例简单介绍基于docker的HAProxy反代

    HAProxy拓展连接 此例简单介绍基于Docker的HAProxy反代 反代: 1.获取haproxy镜像  docker pull haproxy 2.写配置文件haproxy.cfg 1 glo ...

  2. 码海拾遗:Linux常用命令(一)

    一.Linux系统安装 系统安装可以分两类:实体机安装Linux,虚拟机(常用虚拟机软件有两种:VMware和VirtualBox)安装Linux. 安装过程网上有很多教程,这里就不赘述了. 二.常用 ...

  3. 初窥Android AudioFlinger

    Android  AudioFlinger 是Android音频系统的两大服务之一,另一个服务是AudioPolicyService,这两大服务都在系统启动时有MediaSever加载,加载的代码位于 ...

  4. idea激活教程(永久)支持2019 3.1 亲测

    此教程已支持最新2019.3版本 本教程适用Windows.Mac.Ubuntu等所有平台. 激活前准备工作 配置文件修改已经不在bin目录下直接修改,而是通过Idea修改 如果输入code一直弹出来 ...

  5. 94-datetmie模块

    目录 datetmie模块 1 返回当前时间 2 当前时间+3天 3 当前时间-3天 4 当前时间-3小时 5 当前时间+30分钟 6 时间替换 datetmie模块 datetime模块可以看成是时 ...

  6. .Net Core调用oracle存储过程

    一 前言 实战踩坑系列,调用第三方Oracle存储,各种血泪史,现记录如下. 二 入坑 首先,调用Oracle需要安装客户端驱动才行,但是在程序开发中下载客户端驱动是一个不明智的选择.于是,不管是微软 ...

  7. Ansible-基本概述

    为什么要自动化运维 纯手动软件安装部署方式 我们以 10 台机器部署 Nginx 为例.部署步骤如下: 1.通过 ssh 登录一台机器: 2.yum install -y nginx 或者 获取安装包 ...

  8. python2.7.6安装easy_install (windows 64 环境)

    1.复制以下代码保存到easy_install.py文件中(文件名可随意命名)并将该文件放到python的安装路径中(如:D:\Python27) #!/usr/bin/env python &quo ...

  9. Yoshino: 一个基于React的可定制化的PC组件库

    Github: https://github.com/Yoshino-UI... Docs: https://yoshino-ui.github.io/#/ Cli-Tool: https://git ...

  10. Layabox 世界坐标和屏幕坐标互转

    最近在入坑Layabox,花了几天时间做世界坐标和屏幕坐标的互转,由于Layabox没有现成的代码所以只能自己手动写,大概就是模仿unity里面的ScreenToWorldPoint和WorldToS ...