索引是数据库优化中最常见最重要的手段,通过索引可以帮助用户解决大多数的SQL性能问题。
INSERT INTO students(NAME) VALUES('admin0'),('admin1'),('admin2'),('admin3'),(('admin4')),('admin5'),('admin6'),('admin7'),('admin8')
索引是什么
索引是一种实现了B-tree或者B+tree的数据结构,这种数据结构上有专门的查找算法索引的存储分类
MYSQL有两个存储引擎:MYISAM存储引擎:表数据和索引自动分开存储,各种是一个独立的存储文件,表的文件有:.MYD数据文件 .MYI所有文件.frm结构文件
INNODB存储引擎:表的数据和索引都是存储在同一个共享表空间里面,但是有多个文件组成,表的文件有:IBDATA1.IBD 数据库文件
INNODB存储引擎的表空间有两种形式:
共享表空间:默认形式,索引和数据文件是共享表空间
独立表空间形式:索引和表空间分离,多个文件之间可以方便的完成跨数据库甚至跨硬件的数据读写,相对来说比较灵活,版本5.5以上mysql默认存储引擎都是innodb,这样就可以做数据分布式支撑(TODO)mysql目前不支持函数索引,但是能对列的前面一部分进行索引,这样就减少索引的存储空间,可以大大缩小索引文件的大小
适合添加索引的场景
出现在where、orderby、 groupby、 having条件句中的字段,并且他们是频繁进行查询的信息
查找slowsql 慢日志查询找到slowsql
show VARIABLES like '%quer%'
slwo_query_log off ,慢查询日志未开启
开启慢查询日志:
win:my.ini
linux /etc/my.cnf
[mysqlid]元素 slwo_quer_log=TRUE slow_quer_log_file="路径" long_query_log=3
- 执行计划分析sql
DESC SELECT * from students where id = 1;
DESC SELECT * from students where `name` = 'admin1';
没有索引是全表扫描,效率非常低
type类型的性能高低System、const、eq_ref、ref、ref_or_null
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
const代表一次就命中,ALL代表扫描了全表才确定结果。一般来说,得保证查询至少达到range级别,最好能达到ref。
- 使用索引
ALTER TABLE students ADD INDEX in_name(name)
查询索引是否插入成功
MUL是普通索引//TODO
DESC SELECT * from students where `name` = 'admin1';
-导致索引失效
- 使用组合索引:如果符合索引为列1,列2,列3 只使用列2列3则使用不到索引 必须带列1
- like查询
- %放在首位,索引不生效
- 查询为空的时候 null 和 is null ,会使用索引
- 列是字符串,但是查询条件是数字,也会导致索引失效
- where 和 or组合:or左右两遍都是索引 索引才会生效,否则失效