Mysql优化系列之索引性能

  实际上,前面的数据类型和表结构设计优化不能算优化,只能算规范,也就是说在设计表的时候,应该且必须做到这些

  索引是sql优化的核心部分,在《高性能Mysql》中单独抽出一章讲,也印证了其重要性。这一篇也会讲的很细致。

  以下所讲,除少数的如全文索引之外,均以Innodb存储引擎为基本


一、索引是什么

  索引,在Mysql中也叫做"键(key)",是存储引擎用于快速找到记录的一种数据结构。

  这里我们注意到:索引是一种数据结构,节点是有序的,有大小,有时候一张表的索引甚至会有几个G的大小

  另外,索引是在存储引擎层实现的,不同的存储引擎层实现也不同


二、有什么好处

  这个问题,一般可能觉得没啥好回答的,但是我会告诉你,好的sql能使查询效率提高几倍几十倍,但是有索引和没索引,

查询的性能可能相隔几个数量级,不相信的读者可以亲自试一试。


三、有哪些类型

  Mysql支持的索引类型有很多,我简单的列出几种

  B-Tree索引:B-Tree读作B树,不是B减树,一种平衡多路查找树,这种结构的查找效率很高

  B+Tree索引:现在大多数版本使用B+Tree索引,可以分为聚集索引(clustered index)和二级索引(secondary index)。

聚集索引的叶子节点存放的是整张表的行记录数据。二级索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的

聚集索引键,即主键。当通过二级索引来查询数据时,InnoDB存储引擎会遍历二级索引找到主键,然后再通过主键在聚集索引

中找到完整的行记录数据。

  哈希索引:基于哈希表实现,这个用的比较少,支持的存储引擎也有限,不讲

  全文索引:全文索引适用于查找文本中的关键词,而不是简单的where条件操作,这里也不讲,基本没用到

  我们用的最多的B-Tree大致分为普通索引normal,唯一索引unique,联合索引union,另外主键Primary Key也是索引


四、B-Tree索引适用的有效查询情况(这里是重点,写sql一定注意)

  • 全值匹配

  即为等值匹配 where a = 1。失效情形:where a != 1

  • 列前缀匹配

  where name like "mike%",失效情形:where name like "%mike"

  • 最左前缀匹配

    这里最常见的是联合索引的情况。考虑列a,b,c,建立联合索引(a,b,c),请问哪些查询可以用到这个索引?

    有效情形:查a,查a,b,查a,b,c(注意顺序)。

    失效情形:查b,查c,查b,c;查a=1 and b>1 and c=1,此时只能用到索引a,中间不能有范围查询

  • 索引不仅适用于where,也使用于order by子句
  • 索引必须是独立的,不能是表达式的一部分。失效:where a+1 = 5,无法使用索引列a
  • 一些巧妙使用索引的sql语句优化,我会放在下一篇sql语句查询优化讲

五、高性能的索引策略

  我会以例子做引子来讲,这样比较清晰

  • 前缀和后缀索引。用户表中的电子邮箱字段,如何查邮箱是163类型的记录?

  这里我们可以使用"后缀索引",因为163邮箱的后缀字符都是以@163.com结尾,那么我们存储时其实可以将邮箱反转后存储,并以

邮箱字段的前若干位建一个前缀索引,add index idx_name((email(8)),这种情况遇到的也不多

  • 多列索引

  不要粗略的把where子句中的字段都建上索引。要懂得合并索引,前面的索引适用的例子已经讲了,这里不再重复。另外补充一点

将OR条件的2个列单独建索引,然后union后合并结果是一种更好的选择

  • 索引列的顺序

  多列索引的列顺序很重要,这一点在where子句中也会讲到。将能筛选掉最多(筛选后最少)的列优先作为前缀列,这只是一个

经验的做法,有很多具体的数据特征需要去分析

  • 聚簇索引

  当表有聚簇索引时,数据行实际上存放在索引的叶子页中。聚簇,意即数据行和相邻的key值紧凑的存储在一起。

  • 覆盖索引

  一种比较特殊的索引情况。select的列被所建的索引覆盖。那么查询时不必读取数据行,直接从索引中获取。

  • 使用自增列主键

  记住,不要使用非常随机的UUID值作为索引列,这种做法很不负责任,无论是插入时更新索引,还是查询时遍历索引都非常烂。

  • 冗余索引,重复索引,以及不会使用的索引,出于我们的强迫症属性,大胆的删除掉吧

  最后,关于索引可以讲很多很多,不论是理论的东西还是实际的分析,真的很多,笔者省去了4种常见索引的情景,有一些其实

根据索引类型的名称即可知道怎么用,比如唯一索引,就是保证这个索引下的列值必须唯一,比如不能重复的订单号,优惠券兑换码

之类的。其他的一些东西还是得多用客户端Navicat去explain,去试才能更好的选择和使用。

  PS:格式还是没花时间排,感觉很乱*********

原文地址:https://www.cnblogs.com/yb38156/p/9788587.html

时间: 2024-11-01 23:40:20

Mysql优化系列之索引性能的相关文章

(转)MySQL优化系列

原文:http://blog.csdn.net/jack__frost/article/details/71194208 数据库,后端开发者必学,而且现在以MySQL居多.这个系列将系统化MySQL一些高级用法.打算先讲很多人关注的使用方式(增删改查以及其优化),然后就讲数据库和表的操作(很多我们学习忽略的地方),接着就是引擎还有更高级的查询等等.OK,不多说,Let's go! 本系列会逐步更新,从基本知识总结,到sql优化,索引设计优化,存储过程使用优化......并且到后面会给出一些方案设

Mysql优化系列之数据类型优化

本篇是优化系列的第一篇:数据类型 为了不产生赘述,尽量用简洁的语言来描述. 在选择数据类型之前,首先要知道几个原则: 更小的通常更好 尽量使用可以正确存储数据的最小数据类型.更小的数据类型意味着更快,占用更少的磁盘,内存以及缓存,以及处理时间 简单就好 这是出于操作数据类型的效率和代价考虑.整型比字符型操作代价更低,因为字符集和校对规则是字符处理比整型更复杂 两个例子:使用Mysql内建的datatime而不是字符串存储时间,使用整型而不是IP字符串存IP地址 尽量避免NULL 这是个很烦人的值

(2)mysql优化之使用索引优化查询

概述 ??索引是数据库优化中最常用的也是最重要的手段之一.该篇看看索引的分类,使用场景,不能使用的场景等. 索引分类 ??索引是在mysql存储引擎中实现的,而不是在服务器层实现的.索引每种存储引擎的索引不一定相同.mysql支持4种索引: B-tree索引:最常见索引,大部分引擎都支持B树索引. full-text索引:全文索引. hash索引:只有memory引擎支持. R-Tree索引:空间索引是myisam的一种特殊索引,使用比较少. 衍生索引:主键,唯一索引,组合索引,前缀索引等.ha

mysql优化系列1

mysql优化3个步骤: 分析mysql和redis/memcached的搭配是否存在问题; 减少mysql语句等待的时间; 减少mysql语句执行的时间

Mysql优化系列(1)--Innodb引擎下mysql自身配置优化

摘自 http://www.cnblogs.com/kevingrace/p/6133818.html 1.简单介绍InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎.InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读.这些特色增加了多用户部署和性能.没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间.InnoDB也支持FOREIGN KEY强制.在SQL查询中,你可以自由地将InnoDB类

使用连接(JOIN)来代替子查询(Sub-Queries) mysql优化系列记录

使用连接(JOIN)来代替子查询(Sub-Queries) MySQL从4.1开始支持SQL的子查询.这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中.例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来,然后将结果传递给主查询,如下所示: DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FR

MySQL优化(2):索引简述

一.基本语法 创建索引前会先排序,会影响where和order by的效率. 索引也是一张表,保存了主键和索引字段和指向实体表的记录,也是要占空间的,以索引文件的形式存储在磁盘. 增删改数据时,索引指向也要改变,所以会慢,需要频繁删改的字段不适合建索引. 索引的建立也需要不断的优化.调整. 1.创建,两种写法 CREATE [UNIQUE] INDEX 索引名 ON 表(列1,列2); 主键索引:ALTER TABLE 表 ADD PRIMARY KEY (列); #添加一个主键,索引值必须唯一

MySQL优化(5):索引失效分析、in与exists使用场合

一.索引失效的情况 前文提及过可以通过explain的possible_keys.key属性判断索引是否失效,key如果为null,可能是索引没建,也可能是索引失效,下面列举一些会使索引失效的情况. 1.全值匹配:顺序.个数与索引一致 2.最佳左前缀法则:查询从索引的最左前列开始并且不跳过索引中的列,中间跳过的值,后面的索引会失效 3.索引列上做了操作(计算.函数.自动或手动类型转换),会导致索引失效而转向全表扫描 4.存储引擎不能使用索引中范围条件右边的列 name字段用于查找,age>11也

Mysql 优化之延迟索引和分页优化

什么是延迟索引?使用索引查询出来数据,之后把查询结果和同一张表中数据进行连接查询,进而提高查询速度! 分页是一个很常见功能,select   **  from tableName limit  ($page -  1 )  * $n ,$n 通过一个存储过程进行测试: create table smth1 ( id int auto_increment , ver int(11) default null, content varchar(1000) not null, intro varcha