MySQL索引
笔记部分
查看一张表的索引信息
show keys from $tableName;
show index from $tableName;
索引结构
- 哈希索引
适合快速查找一个具体的值,但是不适合排序,范围查找。
- 二叉树索引
适合排序,范围查找。
注意,这里是索引的结构,对应的索引类型可以选择不同的索引结构。
索引类型
- 主键索引:特殊的唯一索引
- 唯一索引
- 全文索引
- 一些常用的单词或者字母组合不能搜索,具体看官网。
- 默认不支持中文,但是可以通过安装插件来实现。
- 如果全文索引中设置了多个字段的话,那么
match
的时候就需要全部的字段,不能设置单个字段 - 仅对MyISAM存储引擎生效
select $field from $tableName where match ($field) against ($world);
- 普通索引
- 空间索引:很少用,用到的时候再说。
索引使用
- select时:选择索引外的字段时,索引失效。
- where时:有索引的字段就行,但是联合索引时(索引不止一个字段,包含多个字段,不是特殊的索引类型),以下情况将失效。
index $field1,$field2,$field3,$field4
搜索时
// 以下搜索时索引生效
$field1
$field1,$field2
$field1,$field2,$field3
// 以下索引将失效
$field2
$field2,$field3
// 简单来说就是一定要讲顺序
一些联合操作也可以使用索引,但是注意顺序,举个例子:
// index:first_name,last_name
select * from users where first_name!='A' and last_name =='B' group by fisrst_name;// 使用索引了
select * from users where first_name!='A' and last_name =='B' group by last_name;// 没有使用索引
索引是first_name,last_name
,跟上面的规则一样,first_name
,first_name,last_name
的顺序是可以的,last_name
是不行的。
问题
- 索引有哪些结构,分别适合什么场景?
- 索引有哪些类型,主要功能是什么?
- 索引使用时有什么规则?和一些常见的联合操作
group by
,min
,max
等的关系是怎样的?
思考
抛开索引的具体的规则,索引就是目录的功能,比如你的表是users
:
id | first_name | last_name |
---|---|---|
1 | A | D |
2 | A | D |
3 | B | C |
如果你没有为fist_name
创建索引,那么当你执行
select * from users where first_name='A';
时,mysql会去遍历表数据,但是当你为first_name
创建索引时,会先去查询first_name
为A
的
索引,接着根据索引获取数据,这就是两者的区别。
但是一般1年多的web开发人员由于对索引知识的欠缺,经常建一些缺少索引的表,后期对这些表查询时,可以使用新建索引进行优化。