整理MySQL相关的知识。
介绍
索引的分类
索引的使用
show variables like '%slow_query_log%'; show variables like '%long_query_time%';
参数说明:
执行: select sleep(5); 查看日志: tail -100f lixj-server-01-slow.log
/usr/local/mysql/bin/mysqld, Version: 5.7.24 (MySQL Community Server (GPL)). started with:
Tcp port: 3306 Unix socket: /tmp/mysql.sock
Time Id Command Argument
# Time: 2020-12-01T08:32:49.043023Z
# User@Host: root[root] @ [113.118.184.243] Id: 927
# Query_time: 11.000212 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
use lixj;
SET timestamp=1606811569;
select sleep(11);
/usr/local/mysql/bin/mysqld, Version: 5.7.24 (MySQL Community Server (GPL)). started with:
Tcp port: 3306 Unix socket: /tmp/mysql.sock
Time Id Command Argument
格式说明:
* 第一行,SQL查询执行的时间
* 第二行,执行SQL查询的连接信息,用户和连接IP
* 第三行,记录了一些我们比较有用的信息,如下解析
Query_time,这条SQL执行的时间,越长则越慢
Lock_time,在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间
Rows_sent,查询返回的行数
Rows_examined,查询检查的行数,越长就当然越费时间
* 第四行,设置时间戳,没有实际意义,只是和第一行对应执行时间。
* 第五行及后面所有行(第二个# Time:之前),执行的sql语句记录信息,因为sql可能会很长。
存储引擎 | Innodb | Myisam |
---|---|---|
存储文件 | .frm 表定义文件.ibd 数据文件 | .frm 表定义文件.myd 数据文件.myi 索引文件 |
锁 | 表锁、行锁 | 表锁 |
事务 | ACID | 不支持 |
CRUD | 读、写 | 读多 |
count | 扫表 | 专门存储的地方 |
索引结构 | B+ Tree | B+ Tree |
一般来说,事务是必须满足4个条件(ACID):
对于ACID的解释如下:
select @@tx_isolation;
在MySQL数据库中设置事务的隔离 级别:
set [glogal | session] transaction isolation level 隔离级别名称; set tx_isolation=’隔离级别名称;’
注意事项:隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
MySQL的表级锁定有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。
MySQL 实现的表级锁定的争用状态变量:
show status like 'table%';
lock table 表名称 read(write),表名称2 read(write),其他;
show open tables;
unlock tables;
说明: 1)共享锁和排他锁都是行锁,意向锁都是表锁,应用中我们只会使用到共享锁和排他锁,意向锁是mysql内部使用的,不需要用户干预。 2)对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁,事务可以通过以下语句显示给记录集加共享锁或排他锁。 共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。 排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。 3)InnoDB行锁是通过给索引上的索引项加锁来实现的,因此InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!
show status like '%innodb_row_lock%';
对于这5个状态变量,比较重要的主要是: Innodb_row_lock_time_avg(等待平均时长) Innodb_row_lock_waits(等待总次数) Innodb_row_lock_time(等待总时长)这三项。 尤其是当等待次数很高,而且每次等待时长也不小的时候,我们就需要分析系统中为什么会有如此多的等待,然后根据分析结果着手指定优化计划。
mysql> create table test_innodb_lock (a int(11),b varchar(16)) engine=innodb;
Query OK, 0 rows affected (0.02 sec)
mysql> create index test_innodb_a_idx on test_innodb_lock(a);
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> create index test_innodb_lock_b_idx on test_innodb_lock(b);
Query OK, 11 rows affected (0.01 sec)
Records: 11 Duplicates: 0 Warnings: 0
Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/mysql相关