定位慢查询

1. 使用 show processlist 定位,查询正在执行的慢查询

可以显示哪些线程正在运行,如果有 process 权限,则可以看到所有线程;否则,只能看到当前会话的线程。

注:show full processlist 可以看到语句的全部内容,否则只能显示每个语句的前 100 个字符

2. 根据慢查询日志定位

MySQL 的慢查询日志记录的内容是:在 MySQL 中响应时间超过参数 long_query_time(单位秒,默认值为10)设置的值,并且扫描记录数不小于 min_examined_row_limit(默认值 0)的语句

MySQL 慢查询的相关参数解释:

查看更多

自增id详解

自增主键好处:可以让主键索引尽量的保持递增顺序插入,避免了页分裂,让索引更加紧凑。

一、自增主键的“空洞”

1. 自增主键存储位置

表的结构定义存放在后缀名为 .frm 的文件中,但是并不会保存自增值。不同的存储引擎对于自增值的保存策略不同。

  • MyISAM 引起的自增值保存在数据文件中

查看更多

索引优化

索引优化的手段

20条索引优化规则:https://www.51cto.com/article/625199.html

1. 方法概览

使用 show index from table_name 查看一个表中的索引。

使用 explain+查询语句 ` 查看这个查询对于索引的命中情况。

使用 show status like 'Handler_read%'; 查看索引使用情况如下:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> show status like 'Handler_read%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Handler_read_first | 2 |
| Handler_read_key | 5 |
| Handler_read_last | 0 |
| Handler_read_next | 1 |
| Handler_read_prev | 0 |
| Handler_read_rnd | 0 |
| Handler_read_rnd_next | 32 |
+-----------------------+-------+

查看更多

普通索引和唯一索引

假设有这样一张表,字段 k 上的值不重复。想要在 k 这个字段上建立索引,从性能角度考虑,应该选择唯一索引还是普通索引呢?那么依据又是什么呢?

一、查询过程

"select id from T where k = 5" 这个语句。在索引树上查找的过程,先是通过 B+ 树从树根开始,按层搜索到叶子节点。通过叶子节点获取到数据页后,然后可以认为数据页内部通过二分法来定位记录。

  • 对于普通索引来说,查找到满足条件的第一个记录后,还需要查找下一个记录,直到碰到第一个不满足 k=5 条件的记录
  • 对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。
查看更多

MySQL保证高可用

MySQL 保证高可用

一、主备延迟

与同步延迟有关的时间点:

  1. 主库 A 执行完一个事务,写入 binlog,把这个时刻记为 T1,每个事务的 binlog 里面都有一个时间字段,用于记录主库上写入的时间
  2. 之后传给备库 B,把备库B 接收完这个 binlog 的时刻记为 T2
  3. 备库 B 执行完成这个事务,把这个时刻记为 T3
查看更多

快速复制一张表

为了避免对源表加读锁,更稳妥的方案是将数据写到外部文本文件,然后再写回目标表。

一、mysqldump 方法

使用 mysqldump 命令将数据导出成一组 insert 语句。可以使用如下命令:

1
mysqldump -h$host -P$port -u$user -p --add-locks=0 --no-create-info --single-transaction  --set-gtid-purged=OFF db1 t --where="a>900" --result-file=/client_tmp/t.sql

这条命令,主要参数含义如下:

查看更多

存储引擎之间的对比

mysql 支持的存储引擎包括:InnoDB存储引擎、MyISAM存储引擎、NDB存储引擎、Memory存储引擎、Archive存储引擎、Federated存储引擎、Maria存储引擎 等

一、InnoDB 存储引擎

支持事务,其设计目标主要面向在线事务处理(OLTP)的应用。其特点是行锁设计、支持外键,默认读取操作不会产生锁。从 MySQL 数据库 5.5.8 版本开始,InnoDB 存储引擎是默认的存储引擎。

InnoDB 存储引擎将数据放在一个逻辑的表空间。从 MySQL 4.1 版本开始,他可以将每个 InnoDB 存储引擎的表单独存放到一个独立的 ibd 文件中。

InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了 SQL 标准的 4 种隔离级别,默认为 repeatable 级别。InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能。

对于表中数据的存储,InnoDB 存储采用了聚集(clustered)的方式,因此每张表的存储都是按主键的顺序进行存放。如果没有显式的表定义时指定主键,InnoDB 存储引擎会为每一行生成一个 6 字节的 row_id,并以此作为主键。

查看更多

InnoDB 和 Memory 存储引擎的区别

InnoDB 存储引擎的数据表会放在主键索引树上,主键索引是 B+ 树。在执行 select * from table 时,会按照叶子节点从左到右扫描,因此扫描出来的数据按照主键的排列是有序的。

Memory 存储引擎的数据和索引是分开的,内存表的数据部分是以数组的方式单独存放,而主键 id 索引中,存的是每个数据的位置。主键 id 是 hash 索引,索引上的 key 并不是有序的。

因此,我们可知,我们罗列一下这两种存储引擎的区别:

查看更多