1、mysql索引的数据结构
mysql索引采用b+树作为其数据结构。我们知道与b+树常常来比较的有红黑树树和b-树。那为什么mysql不采用那几种树作为索引的数据结构呢?我们下面来分析一下。我们知道b树是非叶子节点也存储了数据,而b+树只有叶子结点存储了数据,且有一条链表将叶子结点全部串起来。所以我们可以分析出,b树结点的大小大于b+树结点大小,且b+树更适合于范围查找,因为它有个串起所有叶子结点的链表嘛。又因为b树结点大小较大,所以相同的存储空间,b+树可以存储更多的非叶子结点。那么一次IO中,可以获取到更多的非叶子结点。所以便减少了IO次数,增加了查找性能,要知道IO操作是十分耗时间的。
2、mysql索引的分类
索引分类的话,我先讲一下聚集索引和非聚集索引。
聚集索引,就是索引顺序即数据的物理存储顺序,mysql的innodb的主键索引便是聚集索引。采用Innodb存储引擎的数据按照主键顺序顺序存放。它的好出就是充分利用了局部性原则,非常是和范围和排序操作。那除了聚集索引的索引便是非聚集索引。
其次的分类还有主键索引、唯一索引、复合索引、全文索引。
3、mysql索引的失效情况
4、如何拆表
拆表主要有垂直拆表和水平拆表两种方式。
比如我们有一个学生表,里面有学号、成绩、姓名、年龄四个属性,但是我们经常查询成绩,而对姓名和年龄不关心,那我们则可以把学号、成绩作为一张表,学好、姓名、年龄作为另一张表,否则我们只需要成绩,但是还是扫描到了年龄和姓名,这是极大的资源浪费。
水平拆表,指的表中的记录数过多,比如qq号吧,几亿个qq号放在一个表里显然不合适,我们可以按qq号取模来拆表,这样查询的时候也是先把qq号取模,确定qq号所在的表,再进行查询,这样可以加快查询的速率。
5、数据库范式
第一范式,列具有原则性,不可再分。例如电话中有个人电话与公司电话,则应该分为个人电话和公司电话。
第二范式,考虑一个订单明细表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。因为我们知道在一个订单中可以订购多种产品,所以单单一个 OrderID 是不足以成为主键的,主键应该是(OrderID,ProductID)。显而易见 Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID。所以 OrderDetail 表不符合 2NF。不符合 2NF 的设计容易产生冗余数据。
第三范式,不能出现非主属性的传递依赖。例如orderid里有customerid和custcustomerName,则我们可以知道customerName依赖于customerId,所以与customer相关的信息不应该放到order表里。
6、数据库分页
7、innodb与myisam
innodb采用数据和索引共享表空间。myisam把索引和数据文件和表结构分开存储。那么我们知道,myisam和innodb的索引虽然都采用b+树,但是实现方式却不同。myisam叶子节点存放的是指针,而innodb存放的是实例数据。
innodb支持外键和事物,myisam不支持。
innodb是行锁,而myisam是表锁。
innodb不支持全文索引,而myisam支持全文索引。
innodb的delete*语句是一行行的删除,而myisam的是先drop表再重建表结构。
myisam所占用的存储空间比innodb更小。
综上,我们可以判断出myisam适合select执行较多的场合,而innodb是和插入修改较多的场合,因为innodb支持事物嘛。