根据尚硅谷的视频教程学习MySQL高级内容,学习记录-17 – 索引优化分析。
性能下降SQL变慢,执行时间长、等待时间长,原因以及优化方法:
1 数据过多 – 分库分表
2 关联了太多的表,太多join – SQL优化
3 没有充分利用到索引 – 索引建立(优化效果最好)
4 服务器调优及各个参数设置 – 调整my.cnf
索引
-
索引是什么?
》索引是数据结构,帮助MySQL高效获取数据的数据结构。排好序的快速查找数据结构。
》索引不可能全部存储在内存中,因此索引往往以索引文件的形式存储在硬盘上 -
索引的优势
-提高数据检索效率,降低数据库的IO成本
-通过索引对数据进行排序,降低数据排序的成本,降低CPU消耗 -
索引的劣势
-降低更新表的速度
-索引本身也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间 -
索引结构
索引是在MySQL的存储引擎层中实现的,而不是在服务器层实现的。
-BTree索引★:多路平衡搜索树,BTREE与二叉树对比,查询数据的效率更高,因为对于相同的数据量来说,BTREE的层级结构比二叉树小,因此搜索速度更快。
-B+Tree索引:是BTREE索引的变种,叶子节点保存所有的key信息,所有非叶子节点都可以看做是 key的索引部分。由于B+Tree只有叶子节点保存key信息,查询任何key都要从root走到叶子,因此查询效率更加稳定。
-聚簇索引和非聚簇索引 -
索引分类
- 单值索引:一个索引只包含单个列,一个表可以有多个单列索引
- 唯一索引:索引列的值必须唯一,但允许有空值
- 复合索引:一个索引中包含多个列
- 查看表中的索引
show index from employees;
- 创建索引
#创建单值索引CREATE INDEX [INDEXNAME] ON TABLE_NAME(COLUMN);#创建唯一索引CREATE UNIQUE INDEX [INDEXNAME] ON TABLE_NAME(COLUMN); #此处的column需要是唯一约束#创建主键索引:设定为主键后数据库会自动建立索引,INNODB为聚簇索引,一般不建议更改主键索引#复合索引:对多个字段创建一个索引CREATE INDEX [INDEXNAME] ON TABLE_NAME(COLUMN1, COLUMN2,...);
举例1:对员工表中的姓名创建索引【单值索引】
CREATE INDEX idx_name ON employees(last_name);#此时再查看索引情况如下SHOW INDEX FROM employees;
案例2:【复合索引】对学生表中的姓名sname和性别ssex建立索引
CREATE INDEX idx_name_gender ON student(Sname, ssex); #创建该索引前,表中只有一个主键索引相当于创建了2个索引:对 sname创建索引;对 sname, ssex创建索引;
- 删除索引
DROP INDEX indexname ON tablename;
举例:删除员工表中的姓名索引 idx_name
DROP INDEX idx_name ON employees;#查看当前员工表索引情况
- ALTER 命令调整索引
ALTER TABLE tablename ADD PRIMARY KEY(columnname);#以上语句为表添加主键索引,索引是唯一的,不能是NULLALTER TABLE tablename ADD UNIQUE index_name(columnname);#以上语句创建索引的值必须是唯一的(除了NULL之外,NULL可能出现多次)ALTER TABLE tablename ADD INDEX index_name(columnname);#以上语句添加普通索引,索引值可以出现多次ALTER TABLE tablename ADD FULLTEXT index_name(columnname);#以上语句指定了索引为FULLTEXT,用于全文索引
-
索引的设计原则
10.1 哪些情况需要创建索引
》 主键自动建立唯一索引
》 频繁作为查询条件的字段应该创建索引
》 查询中与其他表关联的字段,外键关系建立索引
》 单键、组合索引的选择问题,组合索引性价比更高
》 查询中排序的字段,排序字段如果通过索引去访问,将大大提高排序速度
》 查询中统计或者分组字段10.2 哪些情况不需要创建索引
》 表记录太少
》 经常增删改的表或者字段
》 WHERE条件里用不到的字段不创建索引
》 过滤性不好的不适合建索引