什么是索引?(别回答是增加效率啥的!)
一个索引是存储的表中一个特定列的值数据结构。索引是在表的列上创建。请记住记住这一点:索引是帮助快速检索数据的数据结构 。
什么样的数据结构是索引?
B树是索引中最流行的数据结构的原因是由于它们具有时间效率 - 因为查找,删除和插入都可以在对数时间内完成,还可以对存储数据排序。散列表是另一种可能会用作索引的数据结构 - 这些索引通常称为散列索引。
哈希索引的缺点?
哈希表不是 有序的数据结构,适合查找键值对,select name from users where id =1 ,但select name from users where id > 4000呢?创建索引成本?
占用空间 - 你的表越大,你的指数就越大。索引的另一个性能是,无论何时添加,删除或更新相应表中的行,都必须对索引执行相同的操作。请记住,索引需要包含与索引覆盖的表列中的任何内容相同的分钟数据。索引还存储指向表格行的指针?
数据库索引也存储指针到表中的相应行。指针只是一个引用行内数据存储在磁盘上的地方。因此,除了存储在索引中的列值之外,指向该值所在表的行的指针也存储在索引中。
一个表可以有多个非聚集索引
一个表可以有多个非聚簇索引,因为它们不会影响像聚簇索引一样在磁盘上存储行的顺序。为什么一张表只能有一个聚集索引?
由于聚集索引决定了将行存储在磁盘上的顺序,因此在一个表上有多个聚簇索引是不可能的。想象一下,如果我们在一个表上有两个聚集索引 - 哪个索引将确定行将被存储的顺序?由于只能对一个表中的行进行排序以仅遵循一个索引,因此不允许使用多个聚簇索引。
使用聚集索引有什么缺点?
如果一个给定的行在其中一个(聚集)索引列中更新了一个值,那么通常会发生的情况是数据库将不得不移动整行以便该表继续按与聚簇索引列相同的顺序排序。这是一个性能问题。这意味着一个简单的UPDATE变成了DELETE,然后是INSERT - 只是为了维护聚集索引的顺序。出于这个原因,聚簇索引通常是在主键或外键上创建的,因为这些值一旦已经是表的一部分就不太可能改变。
聚集索引和非聚集索引之间的区别差异的总结:
聚簇索引决定了表的行将存储在磁盘上的顺序 - 它实际上将行级数据存储在索引本身的叶节点中。非聚集索引对存储行的顺序没有影响。
当可以被群集的数据组经常被一些查询访问时,使用聚簇索引是一个优点。这加快了检索速度,因为数据在磁盘上彼此靠得很近。另外,如果数据的访问顺序与聚簇索引相同,则检索速度会更快,因为存储在磁盘上的物理数据按照与索引相同的顺序排序。
聚集索引可能是一个缺点,因为无论何时对索引列的值进行更改,随后对行重新排序以维护顺序的可能性都是明确的性能影响。
一个表可以有多个非聚集索引。但是,一个表只能有一个聚集索引。
非聚集索引存储的是指向保存该值的实际行的指针。聚集索引不需要存储指向实际行的指针,因为表中的行按照与聚集索引相同的精确顺序存储在磁盘上,并且聚集索引实际上将行级数据存储在它是叶节点。
为什么推荐使用自增主键?
在Mysql文档中推荐使用自增主键,在B+Tree中数字比字符串更快。
分布式主键可以使用snowflake算法、分布式发号机。
本文按照Mysql数据库来解答:
| Innodb | Myisam |
存储文件 | .frm 表定义文件 .ibd 数据文件 | .frm 表定义文件 .myd 数据文件 .myi 索引文件 |
锁 | 表锁、行锁 | 表锁 |
事务 | ACID | 不支持 |
CRDU | 读、写 | 读多 |
count | 扫表 | 专门存储的地方 |
索引结构 | B+ Tree | B+ Tree |
Mysql索引 B+Tree:
图1:
使用MyISAM引擎时,B+Tree索引存储的是指向保存该值的实际行的指针。
图2:
使用InnoDB引擎时,它实际上将行级数据存储在索引本身的叶节点中。如果是Name作为查询条件,先判断是否建立了Name索引,已建立话获取对应的主键ID,在从主键为索引这边查询出来数据。