technology-note/数据库/基础/3.mysql高性能索引.md

45 lines
2.4 KiB
Markdown
Raw Normal View History

2019-04-25 17:17:57 +08:00
---
id: "20190422"
date: "2019/04/22 09:48"
title: "如何高效利于mysql索引"
tags: ["mysql", "index", "高性能"]
categories:
- "数据库"
- "基础"
---
  mysql 相信大部分人都用过,索引肯定也是用过的,但是你知道如何创建恰当的索引吗?在数据量小的时候,不合适的索引对性能并不会有太大的影响,但是当数据逐渐增大时,性能便会急剧的下降。
  本篇是对 mysql 索引的一个归纳总结,如果有错误的地方,记得评论指出哦。
# 索引基础
  我们都有都知道查字典的步骤,是先在**索引页**中找到这个字的页码然后再到对应的页码中查看这个字的信息。mysql 的索引方法也是和这个类似的,先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行。假如有下面的 sql 语句:
```sql
select * from student where code='2333'
```
2019-04-26 09:53:18 +08:00
<!-- more -->
2019-04-25 17:17:57 +08:00
加入 code 列上建立有索引mysql 将使用该索引找到值为'2333'的数据行,然后读取数据行的所有数据返回。
## 索引类型
### B-Tree 索引
&emsp;&emsp;(不是 B 减树,就是 B 树),绝大多数的索引类型都是 B-Tree 的(或者是 B-Tree 的变体通常我们使用的也是这类索引。Mysql 中 MyISAM 存储引擎使用的是 B-treeInnoDB 使用的是 B+TreeB 树和 B+树的区别自行百度。
&emsp;&emsp;树结构的索引能够加快访问数据的速度存储引擎不再需要全表扫描来获取所需的数据取而代之的是从树的根节点来进行二分搜索总所周知二分搜索的速度是相当快的因此我们能够利用索引来极大的提高查询速度。B-Tree 支持以下几种类型的查询:
假设再 student 表中仅有name,age,weight 这样一个多列索引,下面的查询都能利用到此索引
- 全值匹配<br>
和索引列中的所有列进行匹配。比如查询`name='abc' and age=12`,这里用到了第一列和第二列
- 匹配最左前列<br>
只是用索引的开头部分,比如查询`name='ggg'`只使用索引的第一列,查询`name='ggg' and age=12`是用索引的第一、二列。
- 匹配列前缀<br>
也可以只匹配某一列的开头部分,比如查询`name lik 'g%'`,查询 name 以 g 开头的记录。这里用到了第一列
- 匹配范围值<br>
可用于匹配范围值,比如查询`name > 'abc' and `