1:什么是Mysql
Mysql是一种关系型数据库,其默认端口是3306,由于其源码是开源的,
因此可以在GPL(General Public License)的许可下,进行下载并根据个性化进行修改;
2:事务相关
事务是逻辑上的一组操作,要么执行要么不执行;
事务的四大特征ACID:
1:原子性:要么全部完成,要么全部不起作用;
2:一致性:执行事务前后,事务保持一致,多个事务对一个数据的读取结果相同;
3:隔离性:并发访问数据库时,各个并发事务之间数据库是独立的;
4:持久性:事务被提交后,对数据库的数据改变是持久的
针对于并发事务,由于隔离级别可能会导致以下问题:
READ-UNCOMMITTED(读未提交)
脏读(Dirty read):
读了未提交的数据;
READ-COMMITTED(读已提交)
不可重复读(Unrepeatableread):
事务一 第一次和第二次 读取的某数据之间
事务二 对该数据 进行了修改
REPEATABLE-READ(可重复读) (加读写锁解决)
幻读(Phantom read):
事务一 第一次和第二次 读取的一类数据 总量之间
事务二 对该类 数据进行了插入或者删除
不可重复读的重点是修改,幻读的重点在于新增或者删除。
SERIALIZABLE(可串行化) (锁表 所有事务顺序执行)
3:InnoDB的隔离级别
查看Mysql数据库的隔离级别
SELECT @@tx_isolation
默认隔离级别是:REPEATABLE-READ(可重读)
Mysql使用InnDB存储引擎
注意:与 SQL 标准不同的地方在于InnoDB 存储引擎在 REPEATABLE-READ(可重读)事务隔离级别下使用的是Next-Key Lock 锁算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的。
InnoDB 存储引擎在 分布式事务 的情况下一般会用到SERIALIZABLE(可串行化)隔离级别。
4:索引介绍
5:Mysql的基本存储结构
各个数据页可以组成一个双向链表
每个数据页中的记录又可以组成一个单向链表
数据页会为存储在它里边的记录生成一个页目录:
主键作为搜索条件:查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录;
非主键作为搜索条件:只能从最小记录开始依次遍历单链表中的每条记录。
执行SQL时的顺序:
select * from user where indexname = 'xxx'
1:定位到记录所在的页:需要遍历双向链表,找到所在的页 2:从所在的页内中查找相应的记录:由于不是根据主键查询,只能遍历所在页的单链表了
上述描述底层为底层结构就是B+树
没有索引:
需要遍历双向链表来定位对应的页,时间复杂度O(n);
使用索引:
现在通过 “目录” 就可以很快地定位到对应的页上了,二分查找,时间复杂度近似为O(logn);
6:索引的最左匹配原则
联合索引:User表的name和city加联合索引就是(name,city)
select * from user where name=xx and city=xx ; //可以命中索引
select * from user where name=xx ; // 可以命中索引
select * from user where city=xx ; // 无法命中索引
查询的时候如果两个条件都用上了,但是顺序不同,如 city= xx and name =xx,那么现在的查询引擎会自动优化为匹配联合索引的顺序,这样是能够命中索引的。
7:索引的避免冗余
冗余索引指的是索引的功能相同,能够命中就肯定能命中 ;
那么如果存在联合索引如(name,city ),后续不应该新增(name )这索引(冗余索引);
尽可能的扩展已有索引而不是新建索引;
注意:schema_redundant_indexes 表来查看冗余索引
8: Mysql如何为表字段添加索引?
1.添加PRIMARY KEY(主键索引)
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(唯一索引)
ALTER TABLE `table_name` ADD UNIQUE ( `column` )
3.添加INDEX(普通索引)
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引)
ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )