一、mysql索引

1、磁盘文件结构

  innodb引擎:frm格式文件存储表结构,ibd格式文件存储索引和数据。

  MyISAM引擎:frm格式文件存储表结构,MYI格式文件存储索引,MYD格式文件存储数据

2、mysql数据库数据范问原理(innodb、BTREE)

  (1)ibd文件中主键构建b+tree,主键树的叶子结点包含了所有的主键值,存储主键值和对应的表数据

  (2)其他索引构建b+tree,树的叶子结点包含了所有该索引字段的值,存储索引值和主键值。

  原理图如下图所示:

3、索引类型

  普通索引:无任何限制的索引
  唯一索引:列值唯一的索引,可以为空值
  主键索引:表的主键,特殊的唯一性索引,不能为空值
  组合索引:多个字段上的索引,遵循左前缀集合
  全文索引:来查找文本中的关键字

4、使用explain+sql语句进行调优

(1)explain包含的信息包含:

  

   主要从id、type、key、rows、Extra分析。

(2)id

   表示执行的先后顺序,id值大的先执行,小的后执行,id值相同的从上到下执行。

(3)type

   访问类型,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。

   建议尽量达到range级别,常见类型介绍如下:

   const:通过索引一次找到,通常用于主键或唯一性索引。

   eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键 或 唯一索引扫描。

   ref:非唯一性索引扫描,返回匹配某个单独值的所有行。

   range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了那个索引。一般就是在where语句中出现了bettween、<、>、in等的查询。

   index:Index与ALL虽然都是读全表,但index是从索引中读取,而ALL是从硬盘读取。

   all:Full Table Scan,遍历全表以找到匹配的行 。

  (4)key

    实际使用的索引,如果为NULL,则没有使用索引。查询中如果使用了覆盖索引,则该索引仅出现在key列表中 。

  (5)rows

    根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。

  (6)Extra

    Using index: 表示相应的select操作中使用了覆盖索引(Covering Index),避免了访问表的数据行,效率高 。Using where,表明索引被用来执行索引键值的查找,如果没用同时出现Using where,表明索引用来读取数据而非执行查找动作。

    Using  where:表示使用了where条件过滤。

    Convering Index:覆盖索引表示直接从索引中读取数据,sql中查询字段、where条件等涉及的字段都在覆盖索引包含的字段里面。

    Using Index Condition:优化器在索引存在情况下通过符合range范围的条数和总数比例来确定进行索引还是全表遍历。

    Using filesort:无法利用索引完成的排序操作。

    Using temporary:使用临时表保存中建结果,如order by和group by,出现临时表需要优化sql。

5、组合索引

  (1)使用组合索引时需要遵循索引最左匹配原则,使用了最左原则type可以为eq_ref (组合索引为唯一索引)、ref、index,可以使用算法来

查询索引值。如果组合索引为(a,b),使用where a ='value'或者where a ='value' and b='value1'时type为ref。

  (2)使用组合索引时需要遵循索引最左匹配原则,没有使用了最左原则type可以为index,直接扫描索引全表查找索引值。如果组合索引为(a,b),使用where b ='value1'或者where a ='value' or b ='value1' 时type为index。

  (3)组合索引和多个单列索引

    在(a,b,c)3列上建立组合索引和3个单列索引时,where条件为a、b、c3列时,组合索引性能更优,3个单列索引只会走一个最优的单列索引。

6、mysql不走索引的原因       

  1) 没有查询条件,或者查询条件没有建立索引。

  2) 在查询条件上没有使用引导列。

  3) 查询的数量是大表的大部分,应该是30%以上。

  4) 索引本身失效。

  5) 查询条件使用函数在索引列上,或者对索引列进行运算,运算包括(+,-,*,/,! 等)

    错误的例子:select * from test where id-1=9; 正确的例子:select * from test where id=10。

  6) 对小表查询。

  10)隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误。

    由于表的字段tel_num定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给数据库,这样会导致索引失效,

    错误的例子:select * from test where tel_nume=13333333333;正确的例子:select * from test where tel_nume='13333333333'。

  11) 注意使用的特殊符号

   1、<>  、!=。

     2、单独的>,<,(有时会用到,有时不会)。

  12)like "%_" 百分号在前.

    select * from t1  where name like 'linux培训%'。

  13) not in ,not exist。

  15)当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。

  16)B-tree索引is null不会走,is not null会走。

  17)联合索引 is not null 只要在建立的索引列(不分先后)都会走

    in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时,其他建立索引的列可以是is null(但必须在所有列 都满足is null的时候),或者=一个值;当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值),以上两种情况索引都会走。其他情况不会走。

    

    

mysql数据库索引调优的更多相关文章

  1. mysql数据库性能调优总结积累

    mysql数据库的调优大概可以分为四大块 0 架构调优 ---根据业务 读写分库分表   ---主从 读写分离 1 配置的调优 ---开启缓存查询  设置缓存大小 ---最大连接数设置 ---数据库引 ...

  2. MySQL 数据库性能调优

    MySQL 数据库性能调优 MySQL性能 最大数据量 最大并发数 优化的范围有哪些 存储.主机和操作系统方面: 应用程序方面: 数据库优化方面: 优化维度 数据库优化维度有四个: 优化选择: 数据库 ...

  3. MySQL 数据库规范--调优篇(终结篇)

    前言 这篇是MySQL 数据库规范的最后一篇--调优篇,旨在提供我们发现系统性能变弱.MySQL系统参数调优,SQL脚本出现问题的精准定位与调优方法. 目录 1.MySQL 调优金字塔理论 2.MyS ...

  4. Mysql的索引调优详解:如何去创建索引以及避免索引失效

    在正式介绍Mysql调优之前,先补充mysql的两种引擎 mysql逻辑分层 InnoDB:事务优先(适合高并发操作,行锁) MyISAM:性能优先(表锁) 查看使用的引擎: show variabl ...

  5. mysql 数据库缓存调优之解决The total number of locks exceeds the lock table size错误

    环境: mysql5.6.2  主从同步(备注:需操作主库和从库) 一.InnoDB表执行大批量数据的更新,插入,删除操作时会出现这个问题,需要调整InnoDB全局的innodb_buffer_poo ...

  6. MYSQL数据库性能调优之八:mysql日志

    MySQL日志 主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志.中继日志: 使用 SHOW GLOBAL VARIABLES LIKE '%log%';  查询所有日志配置详情: 一. ...

  7. MYSQL数据库性能调优之三:explain分析慢查询

    explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句.使用方法,在select语句前加上explain就可以了. 一.explain ...

  8. MYSQL数据库性能调优之一:调优技术基础

    1.mysql数据库优化技术有哪些? 2.数据库三层结构? 3.数据库3NF

  9. MYSQL数据库性能调优之四:解决慢查询--索引

    为什么索引能够提高查询速度?没有索引 检索数据的方式是从头到尾一条一条挨着匹配,这是慢的根本原因:索引类型BTREE:二叉树类型,原理图如下:对表创建一个二叉树,记录中间数据的物理磁盘地址,二叉树检索 ...

随机推荐

  1. 你循环的时候就可以给他们赋值了,那么就不用addClass,再根据类选择器处理,代码能一气呵成就别写成两段了

    function onCopyButtonClick() { $(".index:checked").each(function () { $(] + "__WeekCo ...

  2. Centos6.8安装php5.6

    检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们, 如: yum remove php.x86_64 php-cli.x86_64 ...

  3. go语言中使用defer、panic、recover处理异常

    go语言中的异常处理,没有try...catch等,而是使用defer.panic.recover来处理异常. 1.首先,panic 是用来表示非常严重的不可恢复的错误的.在Go语言中这是一个内置函数 ...

  4. JAVA This的简单运用

    package Code426;/*当方法的局部变量和类的成员变量重名时,根据“就近原则”,优先使用局部变量如果需要访问本类当中的成员变量,需要使用 this.成员变量 通过谁调用的方法,谁就是thi ...

  5. Django 之 流程和命令行工具

    一.一个简单的web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所 ...

  6. CSRF & CORS 的区别

    转发 CSRF & CORS 的区别 下面转的两篇文章分别说明了以下两个概念和一些解决方法: 1. CSRF - Cross-Site Request Forgery - 跨站请求伪造 2. ...

  7. WPF使用CefSharp嵌入网页

    1.点击项目应用下的管理NuGet程序包 2.在浏览中输入cefsharp-->查找 CefSharp.Wpf-->点击安装,等待安装完成 3.如果遇到一下问题将解决方案和项目都改成64位 ...

  8. 解决ODBC连接Oracle数据库报Unable to connect SQLState=08004问题

    今天用ODBC连接Oracle数据库时,报了这么一个错“Unable to connect SQLState=08004 Oracle ODBC Ora-12154”,上网查了好久都说PowerDes ...

  9. HTML5原生拖拽/拖放(drag & drop)详解

    前言 拖放(drap && drop)在我们平时的工作中,经常遇到.它表示:抓取对象以后拖放到另一个位置.目前,它是HTML5标准的一部分.我从几个方面学习并实践这个功能. 拖放的流程 ...

  10. IBOS云办公系统二次开发之功能介绍(PHP技术)

    IBOS自动化办公系统是我见到的功能.架构最好的开源自动化办公系统,功能与企业需求吻合度之高.架构之灵活,让我不得不将之介绍给大家,让跟多需要学习PHP开发的朋友来了解她,拥抱她! 如果您还没有很好的 ...