MySQL

一.mysql架构

连接层

处理客户端连接,认证授权相关的操作

服务层

最核心的一层,处理sql,包括sql优化,函数调用....

存储引擎层

存储引擎是真正负责来操作数据的,mysql中有不同存储引擎,不同的引擎处理技术不同

物理文件层

存在电脑硬盘上的表数据,日志文件

二.存储引擎

存储引擎是真正负责来操作数据的,不同的引擎处理技术不同(支持事务,行级锁,外键约束,索引技术)

在实际开发中,需要根据具体的操作,来为表选择合适的引擎

新增,修改,删除操作比较多的表,建议使用innodb引擎

查询多的表(例如每月话费账单表),只插入一次数据,后面都是查询操作,建议使用myIsam引擎.

sql 复制代码
查看支持的引擎
SHOW ENGINES;

查看表引擎
SHOW TABLE STATUS LIKE '表名' 修改引擎

方式 1:将 mysql.ini 中 default-storage-engine=InnoDB,重启服务. 
方式 2:建表时指定 CREATE TABLE 表名(...)ENGINE=MYISAM;
方式 3:建表后修改 ALTER TABLE 表名 ENGINE = INNODB;

mysql中常用的两种引擎:

innodb:支持事务,行级锁,外键约束

myisam: 不支持事务,不支持行锁,支持表锁,不支持外键约束

由于现在表数据量比较大,动辄需要对数据库进行拆分,所以使用存储过程、视图、自定义函数这些内容移植性差,所以不建议使用了.

三.索引

1.为什么要用索引

表中存储大量的数据,如果没有索引,需要查询一条数据时,需要从第一条开始查询,直到找到我们需要查询的数据,这么查找效率低.

好处:减少了查询次数,降低IO成本(与硬盘交互次数)

索引已经排好序了,提高排序效率

缺点:索引也是占空间,数据变化之后索引结构也是需要发生改变,所以添加索引也是需要有规则的.

2.索引的原理

索引类似于书的目录,通过目录可以快速的定位到数据的物理位置.

3.什么是索引

索引是帮助mysql高效获取数据的排好序的快速查找的数据结构

在向数据库中插入数据时,mysql自动会为主键创建一个索引树,通过主键查询时,先在主键索引树上查询,可以提高查询效率,找到主键后,就可以快速定位到数据.

4.索引分类

(1)主键索引

一个表中只能有一个主键,primary key

(2)单值索引

一个索引只包含一个列

sql 复制代码
create  index  索引名(表名_列名_index)  on 表名(列名)
(3)组合索引(符合索引)

一个索引中可以包含多个列(建议)

sql 复制代码
create  index  索引名(表名_列名_index)  on 表名(列名1,列名2...)
(4)组合索引最左前缀原则

使用组合索引时,需要在查询条件中用到最左侧列,否则索引失效.

(5)全文索引

mysql中like模糊查询导致索引失效,

mysql中使用全文索引来解决这个问题

sql 复制代码
CREATE FULLTEXT INDEX 索引名 ON 表名(字段名) WITH PARSER ngram; 

SELECT 结果 FROM 表名 WHERE MATCH(列名) AGAINST('搜索词')
(6)索引创建原则

哪些情况建议添加索引

主键

查询条件的列

数据量大的,查询多的表

排序的字段(销量、价格)

建议使用组合索引,少用单值

哪些情况不应该加索引

表记录太少

新增、修改、删除比较频繁的表,因为数据修改,也需要修改索引.

不是查询条件的列,不要加索引

重复率高的(例如:性别、类型...)

(7)索引数据结构

mysql中索引数据结构使用的是B+树

B+树优点:

一个节点中可以存储多个数据,

非叶子节点中不存储表数据,只存储索引数据,这样一个节点中就可以存储更多索引数据

数据都存储在叶子节点,通过主键查询,找到了索引,就找到了数据

叶子节点之间也是建立了连接,所以非常适合范围查询

(8)回表查询

在使用非主键索引查询数据时,例如通过学号查询数据

先在学号索引树查询,查询到之后,还需要去主键索引树查询,因为数据都挂载在主键索引树下

需要回表二次查询,实际开发中,尽量减少回表查询.

四.数据库事务

新增、修改、删除 提交事务

数据库事务是数据对一次连接过程 发送的多条sql执行进行管理,这多条sql要么都执行,要么都不执行.

当一次连接过程中,所有操作都执行没有问题时,向数据库提交事务,数据库才真正的执行sql.

转账:对用户来说转账是一个整体的操作:包含减钱和加钱,必须要保证这多条sql要么都成功执行要么都失败

sql1 从A账户减钱

//异常

sql2 向B账户加钱

提交事务

1.事务特性

原子性:不可拆分,要么都执行,要么都不执行

持久性:事务一旦提交后,不能撤销,保证数据持久保存

隔离性:数据库运行多个事务同时对数据库数据进行操作,操作时给我们提供了4种隔离级别进行选择,保证操作之间相互之间的关系

一致性:数据完整性,经过多次转账操作后,最终的结果需要和我们预期结果是一致

2.事务隔离级别

读未提交:一个事务读到另一个事务还未提交的数据

会出现脏读问题.

读已提交:一个事务只能读到另一个事务提交后的数据

可以解决脏读问题

但是还存在不可重复读问题:在同一个事务中,读取相同的数据两次,结果两次结果不一样

可重复读:在同一个事务中,读取相同的数据两次,结果两次结果一样

可重复读也称为快照读,底层在第一次读取的时候,进行拍照,在同一个事务中,

第二次读的时候,直接读取快照

解决不可重复读问题

部分还存在幻读问题

幻读问题:在同一个事务中,查询两次,两次的数量不一样

可重复读隔离级别,对于普通的查询sql,解决了幻读问题

对于查询语句后面添加了for update的语句,仍然存在幻读问题

串行化:一次只能允许一个事务操作(多个事务对同一条数据),可以解决以上问题,但是效率低

五.MySQL中的锁

1.全局锁

锁住整个数据库,只允许查询操作

一般在备份数据库时使用.

sql 复制代码
FLUSH TABLES WITH READ LOCK

UNLOCK TABLES;

2.表锁

锁着整表,myisam引擎默认只支持表锁,一次只允许一个对该表事务进行操作.

3.行级锁

行锁:精确的锁定操作的那一行数据,例如 update test set age = 20 where id = 1; 锁住id=1的这条记录

间隙锁:锁定一个区间,例如 update test set age = 20 where id >1 and id < 5 锁定了id=2,3,4的记录

行级锁又可以分为:

共享锁:

一般给查询语句添加,

当一条查询语句添加了共享锁后,允许其他事务同时读,但是不允许其他事务为该条记录加排他锁.

排他锁:

新增、修改、删除默认加排他锁

查询语句也可以加排他锁,select ..... for update

相关推荐
StarRocks_labs5 小时前
StarRocks Community Monthly Newsletter (Jun)
数据库·starrocks·数据湖·物化视图·存算分离
光电的一只菜鸡6 小时前
ubuntu之坑(十五)——设备树
linux·数据库·ubuntu
小光学长7 小时前
基于vue框架的防疫物资仓库管理系统09y38(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库
野生技术架构师11 小时前
MySQL数据实时同步到Elasticsearch的高效解决方案
数据库·mysql·elasticsearch
白仑色11 小时前
Oracle 高可用性与安全性
数据库·oracle·数据安全·goldengate·高可用架构
紫无之紫12 小时前
SQL性能调优经验总结
数据库·sql·性能调优
CZZDg12 小时前
Redis Sentinel哨兵集群
java·网络·数据库
__风__12 小时前
PostgreSQL ExecInitIndexScan 函数解析
数据库·postgresql
小云数据库服务专线12 小时前
GaussDB in的用法
数据库·sql·gaussdb