MYSQL支持的索引类型
  BTREE索引
    特点:
      通过引用以B+权的结构存储数据
      能够加快数据的查询速度
      更适合进行范围查找
    应用:
      全值匹配的查询 =
      匹配最左前缀的查询
      匹配列前缀查询 LIKE 'XX%'
      匹配范围值的查询
      精确匹配左前列并范围匹配另外一列
      只访问索引的查询
    使用限制:
      如果不是按照索引最左列查找,则无法使用索引
      使用索引时不能跳过索引中的列,否则只能部分使用或不能使用
      NOT IN 和 <> 操作无法使用索引
      如果查询中有某个列的范围查询,则其右边所有列都无法使用索引

  HASH索引(INNODB自动生成,无法手动创建)
    是基于HASH表实现的,只有查询条件精确匹配,HASH索引中的所有列时,才能使用HASH索引。
    对于HASH索引中的所有列,存储引擎都会为每一行计算一个HASH码,HASH索引中存储的就是HASH码。
    必须进行二次查找
    无法用于排序
    不支持部分索引查找也不支持范围查找
    HASH码计算可能存在HASH冲突

为什么要使用索引?
  索引大大减少了存储引擎需要扫描的数据量
  索引可以帮助我们进行排序以避免使用临时表
  索引可以把随机IO变为顺序IO

索引带来的问题?
  索引会增加写操作的成本
  太多的索引会增加查询优化器的选择时间

索引优化策略
  索引列上不能使用表达式或函数
  前缀索引和索引列的选择性
  联合索引
    如何选择索引列的顺序:经常会使用到的列优先;选择性高的列优先;宽度小的列优先;
  覆盖索引
    优点:可以优化缓存,减少磁盘IO操作;可以减少随机IO,变随机IO操作为顺序IO操作;可以避免对INNODB主键索引的二次查询;可以避免MYISAM表进行系统调用。
    无法使用覆盖索引的情况:存储引擎不支持覆盖索引;查询中使用了太多的列;使用了双%号的LIKE查询;

使用索引扫描来优化排序的条件:
  索引的列顺序和ORDER BY 子句的顺序完成一致
  索引中所有列的方向(升降序)和ORDER BY 子句的顺序完成一致
  ORDER BY 中的字段全部在关联表中的第一张表中

模拟HASH索引优化查询
  用MD5,用BTREE索引进行模拟,需要单独建一列保存MD5值
  只能处理键值的全值匹配查找
  所使用的HASH函数决定着索引键的大小


使用索引来优化查询
  利用索引优化锁
  索引可以减少锁定的行数
  索引可以加快处理速度,同时也加快了锁的释放。

索引的维护和优化
  删除重复和冗余的索引 pt-duplicate-key-checker h=127.0.0.1
  查找未被使用过的索引
  mysql>SELECT object_schema,object_name,index_name,b.TABLE_ROWS FROM `performance_schema`.table_io_waits_summary_by_index_usage a join information_schema.`TABLES` b on a.object_schema=b.TABLE_SCHEMA and a.object_name=b.TABLE_NAME where index_name is not null and count_star=0 order by object_schema,object_name;

更新索引统计信息及减少索引碎片
  analyze table table_name
  optimize table table_name 使用会锁表

Mysq 索引优化的更多相关文章

  1. Mysq索引优化(什么情况创建索引,什么情况不创建索引)

    一.以下情况需要创建索引 1.主键自动建立唯一索引 2.频繁作为查询条件的字段应该创建索引 3.查询中与其他表关联的字段,外键关系建立索引 4.单键/组合索引的选择问题,组合索引性价比更高 5.查询中 ...

  2. MySQL高级学习笔记(四):索引优化分析

    文章目录 性能下降 SQL慢 执行时间长 等待时间长 查询语句写的烂 查询数据过多 关联了太多的表,太多join 没有利用到索引 单值 复合 服务器调优及各个参数设置(缓冲.线程数等)(不重要DBA的 ...

  3. mysql 高级和 索引优化,目的:查的好,查的快,性能好

    1-事物隔离级别: 更新丢失, 并发情况下,对同一字段进行更新,就会出现更新丢失,采用乐观锁,比较版本号或时间戳可解决 读未提交 解决了更新丢失但是会引起脏读, 二个session.sessionA中 ...

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

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

  5. [转]SqlSever2005 一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】一周搞定

    对普通开发人员来说经常能接触到上千万条数据优化的机会也不是很多,这里还是要感 谢公司提供了这样的一个环境,而且公司让我来做优化工作.当数据库中的记录不超过10万条时,很难分辨出开发人员的水平有多高,当 ...

  6. mysql索引优化

    mysql 索引优化 >mysql一次查询只能使用一个索引.如果要对多个字段使用索引,建立复合索引. >越小的数据类型通常更好:越小的数据类型通常在磁盘.内存和CPU缓存中都需要更少的空间 ...

  7. MS SqlSever一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】[转]

    对普通开发人员来说经常能接触到上千万条数据优化的机会也不是很多,这里还是要感谢公司提供了这样的一个环境,而且公司让我来做优化工作.当数据库中的记录不超过10万条时,很难分辨出开发人员的水平有多高,当数 ...

  8. MySQL 数据库性能优化之索引优化

    接着上一篇 MySQL 数据库性能优化之表结构,这是 MySQL数据库性能优化专题 系列的第三篇文章:MySQL 数据库性能优化之索引优化 大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引 ...

  9. mysql优化之索引优化

    Posted by Money Talks on 2012/02/23 | 第一篇 序章第二篇 连接优化第三篇 索引优化第四篇 查询优化第五篇 到实战中去 索引优化 索引优化涉及到几个方面,包括了索引 ...

随机推荐

  1. Django 分类标签查找

    from django.conf.urls import url from django.contrib import admin from blog.views import index,stude ...

  2. 自主学习之RxSwift(二) -----flatMap

    最近项目中有这么一个需求,下面是三个网络请求 A.从服务器获取到时间戳(GET 方法,获取 timeLine) B.进行用户头像上传,获得回传的URL(POST方法,参数为 userId, timeL ...

  3. 微信小程序轮播图

    swiper标签 <!--index.wxml--> <swiper class="swiper" indicator-dots="true" ...

  4. CSS <input type="file">样式设置

    这是最终想要的效果~~~ 实现很简单,div设置背景图片,<input type="file"/>绝对定位上去再设置opacity:0(透明度为0 ) 直接上代码,希望 ...

  5. cocos2d 判断旋转矩形是否包含某个点

    本来想画个图演示一下,但是折腾了一会发现画不好,我的win10系统没有安装office,以后再看的话再补上吧.不废话了. 如图所以,如果判断点P是否被矩形A所包含,非常容易.那么如果矩形A以中心点逆时 ...

  6. JAVA_SE基础——1.JDK&JRE下载及安装

    这是我学了JAVA来写的第一篇博客: 我首先是在传智播客领了张.毕向东老师的免费JAVA学习光盘来学习! 下面我来教大家安装使用JAVA时候必备的JDK 1.首先上甲骨文公司的官方网站下载JDK的安装 ...

  7. Mock API是如何在开发中发光发热的?

    在长期的服务过程中,我们经常会遇到前来咨询的用户与我们反馈以下这种情况:咨询者是一个前端人员,在项目开发的过程中需要与后端进行对接,遇到后端还没完成数据输出的情况下,他只好写静态模拟数据,在遇到大型项 ...

  8. Java8新特性第2章(接口默认方法)

    在Java中一个接口一旦发布就已经被定型,除非我们能够一次性的更新所有该接口的实现,否者在接口的添加新方法将会破坏现有接口的实现.默认方法就是为了解决这一问题的,这样接口在发布之后依然能够继续演化. ...

  9. POJ-2570 Fiber Network---Floyd+二进制表示集合

    题目链接: https://vjudge.net/problem/POJ-2570 题目大意: 一些公司决定搭建一个更快的网络,称为"光纤网".他们已经在全世界建立了许多站点,这 ...

  10. easygui的导入方式

    方法一: >>> import easygui >>> easygui.msgbox('hello') 方法二: >>> from easygui ...