MySQL高级学习记录 - 17 - 索引简介
根据尚硅谷的视频教程学习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); #以上语句为表添加主键索引,索引是唯一的,不能是NULL ALTER 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条件里用不到的字段不创建索引
》 过滤性不好的不适合建索引
- MySQL5.6升级5.7时,出现主从延迟问题排查过程
- MySQL复杂where条件分析
- MySql采用的存储引擎MyISAM和InnoDB
- MySQL学习记录 - 16 -流程控制结构
- MySQL学习记录 - 15 - 存储过程和函数
- 本地Navicat连接阿里云MySQL数据库注意要点
- MySQL学习记录 - 13-视图view
- MySQL学习记录 - 12-TCL(事务控制语言)
- MySQL必知必会:使用WHERE、正则表达式、通配符过滤数据
- mysql执行顺序
- MySQL必知必会:使用SELECT进行数据的简单检索
- MySQL学习记录 - 10-DML语言
- mysql修改my.ini文件后无法启动服务及MySQL 8.0 Command Line Client闪退的问题
- mysql存储过程快速上手
- MySQL 数据库操作
- MySQL学习记录 - 09-联合查询
- MySQL学习记录 - 08-分页查询
- MySQL学习记录 - 07- 子查询
- MySql数据库索引的选择B+的过程
- 关于MYSQL数据库管理员密码丢失找回