MySQL引擎的选择
MyISAM:不支持事务,不支持外键,支持全文检索和表级锁定,读写相互阻塞,读写速度快,节约资源,所以如果应用是以查询操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性,并发性要求不是很高,那么选择这个引擎是很合适的!!
InnoDB:是MySQL的默认存储引擎,由于InnoDB支持事务,支持外键,行级锁定,支持所有辅助索引(5.5.5后不支持全文检索)高缓存,所以用于对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,读写频繁的操作,那么适合选择,比如BBS,计费系统,充值转账等!!!
数据库的索引
MySQL数据库中的索引是帮助MySQL高校获取数据的一种数据结构,索引的本质就是数据结构。
- 普通索引
- 唯一索引
- 主键索引
- 组合索引 将单列索引进行组合
- 外键索引
- 全文索引
如果一张表中有一列是主键列,那么会默认为其创建主键索引(主键列不需要单独创建索引)
show index from 查看索引
create index 索引名 on 表名(字段)
drop index 索引名 on 表名
ALTER TABLE 表名 ADD INDEX 索引名(字段); 普通索引
BTree
B+Tree特点
- 非叶子节点只存储键值信息
- 所有叶子节点之间都有一个连接指针
- 数据记录都存放在叶子节点当中
优点:提高查询速度,减少磁盘io次数,树形结构较小
数据库最左匹配原则,索引的字段是可以任意顺序的。(联合索引)
如果条件中没有最左前缀,则无法命中原则。
数据库索引设计原则
- 对查询频次较高,且数据量比较大的表建立索引
- 使用唯一索引,区分度越高,使用索引的效率越高
- 索引字段的选择,最佳候选列应当从where子句的条件中提取,如果where子句中组合比较多,那么应当挑选最常用,过滤效果最好的列的组合
- 使用短索引,可以提升mysql访问索引的I/O效率
数据库的锁
事务的特性:
- 原子性
- 一致性
- 隔离性 脏读 不可重复度 幻读
- 持久性
锁机制:数据库为了保证数据的一致性,而使用各种共享的资源在被并发访问时变得有序所设计的一种规 则。
锁分类:
按操作分类:(可以体现在sql语句上)乐观锁(自己去实现,只有提交操作的时候检查是否违反数据完整性)、悲观锁
共享锁:也叫读锁,针对同一份数据,多个事务读取操作可以同时加锁而不互相影响,但是不能修改数据记录。
- start transaction 、commit 开启事务 提交事务
- select 语句 lock in share mode 加共享锁行锁
- 根据索引列查加共享锁,会锁住当前行,行锁。
- 如果没有根据索引列查询加共享锁,会锁住当前表,表锁
- 共享锁可以互相兼容
排他锁:也叫写锁。当前的操作没有完成之前,会阻断其它操作的读取和写入。
- select 语句 for update; 查询加排它锁,其它事务不可以加其它锁
MyISAM锁(不支持事务,所以不需要开启事务,加锁即可,表级🔒)
- lock tables 表名 read;加写锁,只支持写锁,所有连接只支持读数据,不支持修改
- unlock tables;解锁的操作
范式级别越高,表与表之间的关系就越复杂
数据库表结构设计(http://open.yesapi.cn/list.html
https://open.yesapi.cn/list.html)
数据库的分库分表策略
水平拆分 优点:不存在单库数据量过大,高并发的性能瓶颈,提高系统稳定性和负载能力
不需要拆分业务模块
垂直拆分