设计一个关系型数据库
索引模块
-
为什么要使用索引
查询时间复杂度从O(n)提升到O(logn)
存在以下弊端,并且会多次io,影响速度。
采用B Tree
-
B tree(多路搜索树,并不是二叉的)是一种常见的数据结构。使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。按照翻译,B 通常认为是Balance的简称。这个数据结构一般用于数据库的索引,综合效率较高。
- 蓝色的关键字的个数永远比黄色的孩子个数少一个
B+ Tree
优势:
1、B+ 树磁盘读写代价更低(叶子结点有多个值, 不用频繁io读取)
2、B+ 树查询效率更加稳定(从根节点到叶子节点长度固定,时间复杂度o(log n))
3、B+ 树叶子节点有指针链接,更有利于对数据库的扫描
Hash索引
BitMap索引
- 主流是B+树还有哈希索引 bitmap位图索引(锁的问题需要考虑)
- oracle支持
密集索引与稀疏索引
区别
1、密集索引文件中每个搜索码值都对应一个索引值
2、稀疏索引只为索引码的某些值建立索引项
如何定位并优化慢查询sql
1、根据慢日志定位慢查询sql
2、使用explain等工具分析sql
3、修改sql或者尽量让sql走索引
mysql
show variables like '%quer%';
show status like '%slow_queries%';
set global slow_query_log = on;
set global long_query_time = '1';
使用explain select name from person order by name desc;
force index 强制使用某种索引
联合索引最左匹配原则
锁模块
- MyISAM默认用的是表级锁,不支持行级锁 (锁整张表,相当于不能并发执行,读锁没有执行完毕,不能进行写锁操作)
-
InnoDB默认用的是行级锁,也支持表级锁
mysql默认自动提交事务
for update 或者增删改排他锁(写锁)
查询 共享锁(读锁)