AI智能
改变未来

MySQL高级学习记录 – 17 – 索引简介

根据尚硅谷的视频教程学习MySQL高级内容,学习记录-17 – 索引优化分析。

性能下降SQL变慢,执行时间长、等待时间长,原因以及优化方法:
1 数据过多 – 分库分表
2 关联了太多的表,太多join – SQL优化
3 没有充分利用到索引 – 索引建立(优化效果最好)
4 服务器调优及各个参数设置 – 调整my.cnf

索引

  1. 索引是什么?
    》索引是数据结构,帮助MySQL高效获取数据的数据结构。排好序的快速查找数据结构。
    》索引不可能全部存储在内存中,因此索引往往以索引文件的形式存储在硬盘上

  2. 索引的优势
    -提高数据检索效率,降低数据库的IO成本
    -通过索引对数据进行排序,降低数据排序的成本,降低CPU消耗

  3. 索引的劣势
    -降低更新表的速度
    -索引本身也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间

  4. 索引结构
    索引是在MySQL的存储引擎层中实现的,而不是在服务器层实现的。
    -BTree索引★:多路平衡搜索树,BTREE与二叉树对比,查询数据的效率更高,因为对于相同的数据量来说,BTREE的层级结构比二叉树小,因此搜索速度更快。
    -B+Tree索引:是BTREE索引的变种,叶子节点保存所有的key信息,所有非叶子节点都可以看做是 key的索引部分。由于B+Tree只有叶子节点保存key信息,查询任何key都要从root走到叶子,因此查询效率更加稳定。
    -聚簇索引和非聚簇索引

  5. 索引分类

  • 单值索引:一个索引只包含单个列,一个表可以有多个单列索引
  • 唯一索引:索引列的值必须唯一,但允许有空值
  • 复合索引:一个索引中包含多个列
  1. 查看表中的索引
show index from employees;

  1. 创建索引
#创建单值索引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创建索引;
  1. 删除索引
DROP INDEX indexname ON tablename;

举例:删除员工表中的姓名索引 idx_name

DROP INDEX idx_name ON employees;#查看当前员工表索引情况

  1. 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,用于全文索引
  1. 索引的设计原则

    10.1 哪些情况需要创建索引
    》 主键自动建立唯一索引
    》 频繁作为查询条件的字段应该创建索引
    》 查询中与其他表关联的字段,外键关系建立索引
    》 单键、组合索引的选择问题,组合索引性价比更高
    》 查询中排序的字段,排序字段如果通过索引去访问,将大大提高排序速度
    》 查询中统计或者分组字段

    10.2 哪些情况不需要创建索引
    》 表记录太少
    》 经常增删改的表或者字段
    》 WHERE条件里用不到的字段不创建索引
    》 过滤性不好的不适合建索引

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » MySQL高级学习记录 – 17 – 索引简介