mysql学习笔记

本文探讨了MySQL索引的数据结构、索引分类及其失效情况,并介绍了表拆分及数据库范式的概念。此外,还对比了InnoDB与MyISAM存储引擎的不同特性。

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支持事物嘛。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值