mysql搜索引擎和索引那些事
mysql的存储引擎
三种存储方式
**InnoDB **(默认)
一个文件存储表结构,一个存储数据和目录(索引)
# 一个文件 book_name | author| press | price | pub_date frm文件 frame的缩写
# 另一个文件(数据+ 目录)
# | 倚天屠龙记 | egon | 北京工业地雷出版社 | 70.00 | 2019-07-01 |
# | 九阳神功 | alex | 人民音乐不好听出版社 | 5.00 | 2018-07-04 |
# | 降龙十巴掌 | egon | 知识产权没有用出版社 | 20.00 | 2019-07-05 |
# | 葵花宝典 | yuan | 知识产权没有用出版社 | 33.00 | 2019-08-02 |
# | 彭于晏的枕边故事 | 彭于晏 | py26期出版社 | 80.00 | 2020-10-30 |
memory
一个文件存储数据结构,数据存储在内存(差的快,早期都是这种存储方式,现在有redis了)
MyIsam
一个文件表结构,一个存储数据,还有一个放目录(索引)
# 一个文件 book_name | author| press | price | pub_date frm文件 frame的缩写
# 另一个文件(数据)
# 另一个文件(目录)
数据库中数据的存储方式
实际的数据库中数据的存储方式
平衡树 balance tree b-tree
b+树 :能够更好的降低树的高度,并且对范围查询比较友好
myisam/innodb存储引擎 : 索引结构都是通过b+树实现的
每一个字段都可以创建索引
对于一个字段创建的索引在当前字段作为条件的时候可以起到加速作用
索引分两类 :
# 聚集索引(聚簇索引) :数据和索引存在一颗树上
# 辅助索引(非聚集索引/非聚簇索引) :数据和索引不存在一颗树上
你必须要在innodb中的所有表都要主动创建主键,主键就是最好的索引
myisam和innodb在索引上的不同
# myisam中所有的索引都是辅助索引
# innodb中主键是聚集索引,其他都是辅助索引
平衡树
用到平衡树的算法,会算取中间范围,让树不会成为歪脖树。所以每次添加索引需要时间长点,他在构造以索引为主的平衡树
B+树
B+树就是平衡树的升级版,将各个节点也可以链式连接起来,这样查找的时候,(20 between 70)就不用回到起点从新查找。就可以纵向查找了
索引
索引的优点 : 加速查询效率
索引的缺点 : 拖慢写的速度,占用更多的硬盘(解决办法分布式读写分离)
# create index 索引名 on 表名(字段名);
# create index ind_id on s1(id);
# drop index 索引名 on 表名;
# drop index ind_id on s1;
# 查看
# show create table s1;
- 正确的使用索引
- 这里说一下,mysql只能命中一个索引,当你创建多个索引的时候,他在执行语句时,会先走分析器,分析使用什么索引最快,就是平衡树结构更健康。如果你想看mysql分析结果。在查询语句前加上explain
# 1.对哪个字段创建了索引,条件就使用那个字段
# 2.条件列不能参与计算,不能调用函数
# 3.如果列中重复值多,那么不适合创建索引(性别)(1/10)
# 4.尽量不使用范围查询,范围越小效率越高
# 5.使用like 'a%'
# 6.and 相连的多个条件 如果有一个索引都可以被命中
# 7.or 相连的多个条件 必须都有索引才能命中
# 8.联合索引和最左前缀原则(不能使用范围,从使用了范围的那个字段之后的所有条件都无法命中索引,条件之间只能用and不能用or)
# create index mix_ind on s1(id,email,name);
# 可以命中索引
# select * from s1 where id = 2000000 and email='eva2000000@oldboy' and name='eva';
# select * from s1 where id = 2000000 and name='eva';
# select * from s1 where id = 2000000 and email='eva2000000@oldboy';
# select * from s1 where id = 2000000;
# 2000000 eva jingliyang@xxx
# 不能命中索引
# select * from s1 where email='eva2000000@oldboy';
# select * from s1 where name='eva';
# select * from s1 where id = 1000000 and email like 'eva2000000@oldboy';
联合索引就是用多个字段当索引,以主键为第一个(id)开始分大小,id分完按照下一个email开始分,进行排序,形成树
索引合并
-
意思是:创建的时候是2个单独的索引,但是在使用的时候临时合并成一个。
以下是查看mysql分析查看的结果,Mysql把2个独立的索引合并成了一个使用,为了更快捷的查看以下图片中的语句。
索引覆盖
'Using Index'的意思是“覆盖索引”,它是使上面sql性能提升的关键
一个包含查询所需字段的索引称为“覆盖索引”
MySQL只需要通过索引就可以返回查询所需要的数据,而不必在查到索引之后进行回表操作,减少IO,提高了效率
以下例子
上图,首先我们要知道。innodb中主键是聚集索引,其他都是辅助索引
加入上表不是以id为主键的表,所以id是辅助索引,当你查询的时候,需要通过id找到主键,在从聚集索引中查找在辅助索引中找到的主键,此时需要回表。
而我查询的只是索引。不需要回表,因为已经查到了。这就是索引覆盖
MySQL只需要通过索引就可以返回查询所需要的数据,而不必在查到索引之后进行回表操作,减少IO,提高了效率