索引方法
fullText:全文索引,为解决like ‘%dada%’这种查询方法而出现的 目前只有MyISAM支持
HASH:hash表,当=或者in的时候很快,但是范围地查找,排序的话就会很慢
BTREE:一定的算法组成的二叉树,mysql默认的索引
RTREE:优势在于范围查找
索引类型:
普通索引:仅加速查询
唯一索引:加速查询 + 列值唯一(可以有null)
主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
全文索引:对文本的内容进行分词,进行搜索
使用索引应注意的地方
1.索引不会包含有NULL值的列
2.使用短索引
4.like语句操作
5.不要在列上进行运算
6.不使用NOT IN和<>操作
索引级别
system>const>eq_ref>ref>range>index>ALL
system级别:
1.只有一条数据的系统表
2.或衍生表只能有一条数据的主查询
很明显 实际开发当中 我们是不会只有一条数据的
const级别
1.仅仅能查出一条的SQL语句并且用于Primary key 或 unique索引;
主键索引 唯一索引 和 unique索引 达到这个级别 我们写sql 要根据公司的业务去写
eq_ref级别
唯一性索引:对于每个索引键的查询,返回匹配唯一行数据(有且只有1个,不能多,不能0);
此种情况常见于唯一索引和主键索引;
ref级别
非唯一性索引:对于每个索引键的查询,返回匹配的所有行
range级别
指定范围,where后面是个范围
index级别
把索引的数据全查出来 就是这个级别了
ALL级别
不做索引 就是all级别
MySQL 索引是怎么实现的?
索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。
mysql隔离级别
为提交读,提交读,可重复读,序列化。
数据库常用引擎
innodb,myiasm
innodb:提供了行级锁和外键的约束,并发高,但锁空间占用较多。InnoDB 会在内存中建立缓冲池,用于缓冲数据
和索引。
但是该引擎不支持全文索引,启动比较慢,不会保存表的行数。
缓冲池:
使用Buffer Pool来实现数据的缓存,undo log、redo log以及binlog来保证数据的正常更新。
Buffer Pool 本质上一块内存,所以它不可能是无限大的,默认情况下是128MB
磁盘和内存之间数据交互是通过数据页的,想去更新某一行数据,数据库会加载这行数据所在的页到
Buffer Pool中再进行后续操作
默认情况下一个数据页的大小是16KB
在数据库启动的时候,数据库就会去找操作系统申请一块区域作为Buffer Pool的内存区域,数据库为
Buffer Pool设计了一个free 链表(空闲缓存页描述链表)
这个free 链表中,每个节点就代表了一个空闲的缓存页的描述信息的地址。也就是说,如果一个缓存
页是空闲的,那么它的描述信息的地址肯定就在 free 链表中
将磁盘上的页读取到Buffer Pool的缓存页中的步骤
1:从free链表中获取一个空闲缓存页的数据描述块
2:将磁盘中的某一个数据页加载到这个数据描述块对应的空闲缓存页中
3:从free链表中移除这个数据描述块