一:数据库索引是什么?用于干嘛的?
索引是一种数据结构,并在表的列上创建,包含一个表中列的值,并且这些值存储在一个数据结构中。(最常见的是B+Tree)。 数据库索引其实就是为了使查询数据效率快二:数据库索引分为哪些?
- 聚集索引:
主键索引(PRIMAY KEY):主键索引是一种特殊的唯一索引,将索引建在主键上, 不允许NULL值 - 非聚集索引:
普通索引(INDEX):普通索引是最基本的索引,没有什么特别限制,主要是为了增加这个字段的查询效率速度
唯一索引(UNIQUE):唯一索引是强调表中数据记录的唯一性,允许NULL值
全文索引(FULLTEXT):全文索引对文本的内容进行分词搜索 - 联合索引:联合索引遵循最左侧原则
组合索引:组合索引是多列值组成一个索引,专门用于组合搜索,效率大于索引合并。
三:有哪些情况会导致索引失效,不走索引?
1. like%符号加上前面不走索引
2. 用索引列进行计算
3. 对索引列用函数
4. 索引列用 != 判断
4:如何知道数据语句是否有使用索引?
使用explain关键字:explain select * from table;
主要关注type和key;
type=ALL :表示全表扫描
type=const :表示通过索引一次就找到了
key=NULL :表示没有使用索引
key=primary :表示使用了主键
key一般=使用了主键/索引的名字
五:创建索引的原则:
凡事都有两面,有利必有弊。建立索引也是同样的道理,我们在增加了检索速度的同时,也会损耗相当的更新性能。所以建立索引前,要慎重的讨论清楚,确实需要的时候再加。
适合创建索引情况:
1.经常需要搜索的列,加快查询速度;
2.主键列上,强调唯一性;
3.经常用在连接的列,这些列主要是一些外键,可以加快连接的速度;
4.经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
5.经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
6.经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
不适合创建索引情况:
1.在查询中很少使用或者参考的列不应该创建索引。因为很少使用到,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
2.只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
3.定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
4.当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引