码迷,mamicode.com
首页 > 数据库 > 详细

SQL索引是什么?索引的作用是什么?索引的优点是什么?索引的缺点是什么?索引的分类?什么情况下该创建索引?

时间:2020-03-31 01:15:09      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:增删改   alter   arc   唯一索引   高效   快排   默认   应用   不能   

1.SQL索引是什么?
定义:索引(Index)是帮助MySQL高效获取数据的数据结构,就好比书的目录,加快数据库的查询速度。
2.SQL索引的作用是什么?优点是什么?
提高查询效率
消除数据分组、排序
避免“回表”查询(索引覆盖)
优化聚合查询
用于多表JOIN关联查询
利用唯一性约束,保证数据唯一性
InnDB行锁实现
3.使用索引的优点
(1)可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性.
(2)建立索引可以大大提高检索的数据,以及减少表的检索行数
(3)在表连接的连接条件 可以加速表与表直接的相连
(4)在分组和排序字句进行数据检索,可以减少查询时间中 分组 和 排序时所消耗的时间(数据库的记录会重新排序)
(5)建立索引,在查询中使用索引 可以提高性能
4.SQL索引的缺点是什么?
(1)增加I/O成本。在创建索引和维护索引 会耗费时间,随着数据量的增加而增加
(2)增加磁盘空间。索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间
(3)不合适的索引或索引过多,会降低增删改的效率。.当对表的数据进行 INSERT,UPDATE,DELETE 的时候,索引也要动态的维护,这样就会降低数据的维护速度,(建立索引会占用磁盘空间的索引文件。
一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快)。
5.索引的分类?
(1)按存储结构分类:
- BTREE:InnoDB & MyISAM
- HASH:HEAP,NDB,InnoDB AHI
- Fractal Tree:TokuDB
- RTREE
- FULLTEXT
(2)按数据的存储方式(物理结构)分类:
- 聚集索引:聚簇索引的顺序就是数据的物理存储顺序,索引与数据存放在同一个文件中。   (表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个)
- 非聚集索引:非聚簇索引的顺序与数据的物理存储顺序不同,索引与数据存放在不同的文件。  (非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249个)
(3)按应用层次分类:
(1)普通索引
        最基本的索引,它没有任何限制,用于加速查询。
(2)唯一索引
        索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
(3)主键索引
        是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引。
(4)组合索引
        指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合。
(5)全文索引
        主要用来查找文本中的关键字,而不是直接与索引中的值相比较。
        fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。
        fulltext索引配合match against操作使用,而不是一般的where语句加like。
        它可以在create table,alter table ,create index使用,不过目前只有char、varchar,text 列上可以创建全文索引。
6.主键与唯一索引的区别
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。 唯一性索引列允许空值,而主键列不允许为空值。 主键列在创建时,已经默认为空值 + 唯一索引了。
主键可以被其他表引用为外键,而唯一索引不能。 一个表最多只能创建一个主键,但可以创建多个唯一索引。 主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。 在 RBO 模式下,主键的执行计划优先级要高于唯一索引。 两者可以提高查询的速度。
7.什么情况下该创建索引?
频繁作为查询条件的字段应该创建索引;
查询中与其他表有关联的字段,例如外键关系;
在经常需要排序(order by),分组(group by)和的distinct 列上加索引,可以加快排序查询的时间,
8.什么情况下不创建索引?
(1)查询中很少使用到的字段 不应该创建索引,如果建立了索引然而还会降低mysql的性能和增大了空间需求.
(2)值重复率高的字段不适合建索引(比如性别、百万级数据时比如26个字母)
数据很少的字段也不应该建立索引,比如 一个性别字段 0或者1,在查询中,结果集的数据占了表中数据行的比例比较大,mysql需要扫描的行数很多,增加索引,并不能提高效率
(3)定义为text和image和bit数据类型的列不应该增加索引,
(4)当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作是互斥的关系
9.为什么性别不适合创建索引?
因为你访问索引需要付出额外的IO开销,你从索引中拿到的只是地址,要想真正访问到数据还是要对表进行一次IO。
假如你要从表的100万行数据中取几个数据,那么利用索引迅速定位,访问索引的这IO开销就非常值了。
但如果你是从100万行数据中取50万行数据,就比如性别字段,那你相对需要访问50万次索引,再访问50万次表,加起来的开销并不会比直接对表进行一次完整扫描小。

SQL索引是什么?索引的作用是什么?索引的优点是什么?索引的缺点是什么?索引的分类?什么情况下该创建索引?

标签:增删改   alter   arc   唯一索引   高效   快排   默认   应用   不能   

原文地址:https://www.cnblogs.com/cdlyy/p/12602419.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!