最近写了很多关于mysql的查询,联表等,所以索性对mysql方面开始巩固复习一下,,其实关于索引一直只知道怎么用,具体干啥却不是很了解,QAQ。
关于MySQL索引
**
mysql索引(index)是什么
**
索引是一种特殊的数据库结构,由数据库表中的一列或多列组合而成,可以实现快速 查询数据表中的特定值的记录。
通过索引可以不用读整个数据库的所有信息,而是直接查询索引列,这样不仅大大节省了查询的时间,还提高了整个项目的效率。
不是很李姐的同学们,可以比作字典,例如要查字典中的某一个字(数据库中的某条记录),如果没有音序表(索引),就要不厌其烦的翻找几百上千页,而如果有音序表,则大大节省了我们的时间和效率。
关于索引的优点
总结一下:
- 减少服务器扫描数量,提高效率
- 避免排序和创建临时表
- 将随机IO变为顺序IO
- 可以让查询锁更少的元组,提高表访问并发性
- 通过创建唯一索引,保证数据库每一条数据的唯一性
- 加速表与表之间的连接,比如说联查。
- 优化隐藏器,提高系统性能
有优点自然也有缺点
- 创建和维护索引需要花费大量的时间
- 创建索引除了占用数据空间,还要占用物理空间(聚簇索引占用的物理空间更大)
- 做增删改时,修改了表数据,相应的索引也要进行修改(索引只是增加了查询,对增删改并没有提升)
- 对于非常小的表,索引的意义非常小。
所以我们要找对适合的索引处:
总而言之分为几大类:经常需要搜索的列,主键列,经常用在连接(JOIN)的列,经常需要根据范围搜索的列,经常需要排序的列,经常使用在WHERE子句中的列。
索引分类
逻辑分类
主键索引
ALTER TABLE TableName ADD PRIMARY KEY(column_list);
唯一索引:数据列不允许重复,允许为 NULL 值,一张表可有多个唯一索引,索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
CREATE UNIQUE INDEX IndexName ON
TableName
(字段名
(length));
或者 ALTER TABLE TableName ADD UNIQUE (column_list);
物理分类
非聚簇索引和聚簇索引。
## 聚簇索引
聚簇是为了提高某个属性(或属性组)的查询速度,把这个或这些属性(称为聚簇码)上具有相同值的元组集中存放在连续的物理块。
聚簇索引是一种数据存储方式,这种存储方式是靠B+树来实现的,把主表的主键构造成一棵B+树且B+树的树叶构成表的行记录数据时,则为聚簇索引(数据和索引是结合的)
##非聚簇索引
非聚簇索引,数据和索引是分开的,B+树叶子节点存放的不是数据表的行记录
聚簇索引优缺点
优点: 数据访问更快。(索引与数据在同一个B+树中,访问更快)
对于主键的排序查找和范围查找速度更快缺点: 插入速度严重依赖于插入顺序 更新主键代价高 二级索引访问需要两次索引查找