文档章节

mysql索引基础知识

图腾Dark
 图腾Dark
发布于 2016/03/20 17:01
字数 920
阅读 8
收藏 0

题外话:

     从深圳另一个项目组交接了一个项目,这也是来到新公司后让我接手的第一个项目。在我接手的这段日子了,请公司测试部门的同事对一些主要的业务进行的压力测试。测试的结果并不理想。我仔细翻看了以前同事的逻辑以及数据库表的创建和sql语句的写法。发现有些sql并没有很好的使用索引导致查询响应时间并不理想。我自己其实索引也使用的不好。正好趁着这个机会买了本《mysql高性能》书籍进行学习。由于书比较厚,只是针对索引部分学习了书本中的知识。在此整理一些知识点分享给和我有类似经验的人。

正文:

    索引是什么:

    索引是存储引擎用于快速找到记录的一种数据结构。在mysql中,存储引擎用类似的方法使用索引,其先在索引中找到对应的值,然后根据匹配的索引记录找到对应的数据行。mysql只能高效的使用索引的最左前缀列。创建一个包含两个列的索引,和创建两个只包含一列的索引是大不相同的。mysql中,索引是在存储引擎层而不是在服务器层现实的。所以,并没有统一的索引标准。当人们谈论索引的时候,如果没有特别指明类型,那多半说的是B-Tree索引,它使用B-Tree数据结构来存储数据。

    说到这里特别强调了最左前缀列。那么在写sql的时候怎么样才能使用到这种B-Tree索引呢?下面总结出了几点需要注意的地方:

    • 全值匹配:全值匹配指的是和索引中的所有列进行匹配

    • 匹配最左前缀:即只使用索引的第一列。

    • 匹配列前缀:也可以匹配某一列的值得开头部分。这里也只使用了索引的第一列。

    • 匹配范围值:这里也是使用了索引的第一列。

    • 精准匹配某一列并范围匹配另外一列

    • 只访问索引的查询:B-TREE通常可以支持“只访问索引的查询”,即查询只需要访问索引,而无需访问数据行。

    那么也有些方式是不能使用到索引的,下面有些需要注意的地方:

    • 如果不是按照索引的最左列开始查找,则无法使用索引

    • 不能跳过索引中的列

    • 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找

    书中别特强调了索引的顺序很重要这些限制都和索引列的顺序有关。在优化性能的时候,可能需要使用相同的列但顺序不同的索引来满足不同类型的查询需求。

    下面针对上面介绍的注意点给出一些自己测试的示例,来帮助大家理解:

    CREATE TABLE `person` (

      `id` int(11) NOT NULL AUTO_INCREMENT,

      `name` varchar(30) DEFAULT NULL,

      `age` int(11) NOT NULL,

      `number` int(1) NOT NULL,

      PRIMARY KEY (`id`),

      KEY `idx_person_name` (`name`,`age`)

    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

    mysql> EXPLAIN select * from person where age=10;

    +----+-------------+--------+------+---------------+------+---------+------+------+-------------+

    | id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows | Extra       |

    +----+-------------+--------+------+---------------+------+---------+------+------+-------------+

    |  1 | SIMPLE      | person | ALL  | NULL          | NULL | NULL    | NULL |    4 | Using where |

    +----+-------------+--------+------+---------------+------+---------+------+------+-------------+

    通过上面的例子可以看到什么叫做最左前缀。





    

    

  


© 著作权归作者所有

图腾Dark
粉丝 0
博文 2
码字总数 2400
作品 0
成都
私信 提问
skymvc开发简易搜素引擎

skymvc开发简易搜素引擎 /* 作者 雷日锦 2016-05-24 *大家好,欢迎学习。今天给大家讲一个简易搜索引擎的开发。 *搜索引擎分为两部分:蜘蛛 和 全文索引 *演示地址:http://skycms.deitui.co...

得推网络
2016/05/24
174
0
Java实习总结网易百度小米美团阿里(均offer)

本人是大三的软件工程专业学生,从2017年3月开始学Java,从那时候还不知道什么是接口,到现在分布式也有所了解,很幸运的拿到了这些offer 2017年10月 网易考拉 Java 12月 百度 Java 2018年 ...

牛客网
2018/06/22
0
0
mysql基础知识

mysql基础知识 ——以下内容摘自马哥教育 === mysql是数据管理服务程序软件,用于管理数据。mysql是关系型数据库管理系统,C/S架构,服务端和客户端之间使用mysql协议进行通信,oracle,memc...

zhuhc1988
2016/12/26
0
0
系统的撸一遍MySQL - MySQL读书笔记

作为一个工作6年的PHP工程师,说实话从来没有系统的去看过一本MySQL的书,哪怕入门的书,表示真的很汗颜。。。 记得最早学数据库的时候学过sql server、oracle 但是最终没有搞Java、也没有搞...

logbird
2016/08/20
186
3
这份MySQL索引实践清单,已超300人在学习,推荐你看看

特邀嘉宾 叶 金 荣 知数堂联合创始人 & 3306π社区负责人 MySQL优化课程讲师 资深MySQL专家,Oracle MySQL ACE,曾任职搜狐畅游DBA主管,精通MySQL数据库,10年以上MySQL相关工作经验,擅长M...

n88lpo
2018/05/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PhotoShop 色调:理解直方图/RGB通道信息

一、直方图:图表的形式,展示图像像素分布的情况 1.平均值:表示平均亮度 2.标准偏差值:表示亮度值范围内的中间值 3.像素: 表示用于计算直方图的像素总数 4.色阶:显示指针下面的区域亮度...

东方墨天
28分钟前
6
0
wildfly(JBoss AS)应用服务器快速入门

什么是wildfly JBoss AS 从8版本起名为wildfly。Wildfly是一个开源的基于JavaEE的轻量级应用服务器。可以在任何商业应用中免费使用。 WildFly是一个灵活的、轻量的、强大管理能力的应用程序服...

程序新视界
52分钟前
5
0
Java集合类常见面试知识点总结

Java集合类学习总结 这篇总结是基于之前博客内容的一个整理和回顾。 这里先简单地总结一下,更多详细内容请参考我的专栏:深入浅出Java核心技术 https://blog.csdn.net/column/details/21930...

Java技术江湖
56分钟前
6
0
怎么用for循环打出爱心

先上效果图: 这是用*组成的爱心,下面讲讲思路: 首先这个图形可以拆分成三部分:第一部分是上面三行的两个梯形,第二部分是中间三行的长方形,第三部分是最下面的倒三角形。 其实图形拆分好...

INEVITABLE
今天
4
0
用HttpUrlConnection伪造成HttpClient

https://www.jianshu.com/p/27ad06cc39d2

shzwork
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部