mysql学习之旅08-索引
概念:索引相当于目录,在数据库中维护表数据的顺序。快速定位数据。一张表可以设置多个索引。但不代表越多越好,索引本身占用系统资源。频繁使用的列建议追加索引
作用:
- 提高数据的查询速度,节省系统资源
- 确保数据的唯一性
- 可以加速表和表之间的连接,实现表与表之间的参照完整性
- 使用分组和排序子句进行数据检索时,可以显著减少分组和排序的时间
分类:
- 普通索引:提高查询效率
- 唯一约束:为了避免列值重复,创建了唯一性约束,自动创建。
- 主键索引:表设置主键会自动生成,一张表只能有一个
- 复合索引:将多个列合并在一起建立索引(一般情况下,不推荐)
- 全文索引:只能用于MyISAM引擎,使用与大字段文本
- 空间索引:对空间数据类型的列,必须声明not null,只能用于MyISAM引擎
使用:
- 创建索引
create index 索引名 on 表名(字段名)
- 修改索引:先删除再创建
- 删除索引
drop index 索引名 on 表名
- 查看索引
show index(或keys) from 表名
准则:
- 索引不是越多越好
- 不要对经常变动的数据加索引
- 小数据量的表建议不要加索引
- 索引一般应加载查找条件的字段
注意:
- 准确查询会使用索引
- 模糊查询,只有确定开头(‘xx%’)才使用索引
数据库设计:
E-R图
- 实体(Entity): 名词,矩形
- 属性(Attribute): 名词,椭圆
- 关系(Service): 动词,菱形
三个范式:
- 第一范式:1NF 原子性
表中的列具有原子性,不可分割,数据不能重复
- 第二范式:2NF 实体完整性
表中需要设置主键,确保实体完整性,表中的非主键属性依赖于主键
- 第三范式:3NF 不能有传递依赖
表中非主键列直接依赖主键,不能有传递依赖,如果有传递依赖,需要拆分表,设置主外键关系,确保引用完整性
SQL优化:
- 索引优化
- 选择合适的列数据类型
- 尽可能使用NOT NULL
- 避免使用多表连接,join的字段需要加索引
- 尽量不要使用子查询
- 尽量再where子句中使用!=或<>操作符
- 慎用in 和not in
- 尽量使用数字类型的字段
- 查询尽量避免使用*,写出需要查询的字段