尚硅谷MySQL数据库高级-03-查询截取分析

Mysql 设计超市经营管理系统,包括员工库存表(stock) 和 仓库表(warehouse) 无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门。 阅读详情

转载参考:

  • https://github.com/RingoTangs/LearningNote/blob/master/MySQL/MySQL.md
  • https://blog.youkuaiyun.com/qq_21579045/article/details/99702766

查询截取分析的步骤

  • 分析:

    • 1、观察,至少跑1天,看看生产的慢SQL情况。

    • 2、开启慢查询日志,设置阈值,比如超过5秒钟的就是慢SQL,并将它抓取出来。

    • 3、explain + 慢SQL分析。

    • 4、show Profile。

    • 5、运维经理 OR DBA,进行MySQL数据库服务器的参数调优。

  • 总结(大纲):

    • 1、慢查询的开启并捕获。

    • 2、explain + 慢SQL分析。

    • 3、show Profile查询SQL在MySQL数据库中的执行细节和生命周期情况。

    • 4、MySQL数据库服务器的参数调优。

查询优化

永远小表驱动大表

  • 优化原则:对于MySQL数据库而言,永远都是小表驱动大表。
/**
* 举个例子:可以使用嵌套的for循环来理解小表驱动大表。
* 以下两个循环结果都是一样的,但是对于MySQL来说不一样,
* 第一种可以理解为,和MySQL建立5次连接每次查询1000次。
* 第一种可以理解为,和MySQL建立1000次连接每次查询5次。
*/
for(int i = 1; i <= 5; i ++){
    for(int j = 1; j <= 1000; j++){
        
    }
}
// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
for(int i = 1; i <= 1000; i ++){
    for(int j = 1; j <= 5; j++){
        
    }
}

  • IN和EXISTS
/* 优化原则:小表驱动大表,即小的数据集驱动大的数据集 */

/* IN适合B表比A表数据小的情况*/
SELECT * FROM `A` WHERE `id` IN (SELECT `id` FROM `B`)

/* EXISTS适合B表比A表数据大的情况 */
SELECT * FROM `A` WHERE EXISTS (SELECT 1 FROM `B` WHERE `B`.id = `A`.id);

  • EXISTS:
    • SELECT … FROM table WHERE EXISTS(subquery)

    • 该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE或FALSE)来决定主查询的数据结果是否得以保留。

    • 提示

      • EXISTS(subquery)只返回TRUE或FALSE,因此子查询中的SELECT *也可以是SELECT 1或SELECT ‘X’,官方说法是实际执行时会忽略SELECT清单,因此没有区别。
      • EXISTS子查询的实际执行过程可能经过了优化而不是我们理解上的逐条对比,如果担心效率问题,可进行实际检验以确定是否有效率问题。
      • EXISTS子查询往往也可以用条件表达式/其他子查询或者JOIN来替代,何种最优需要具体问题具体分析。

ORDER BY优化

Case

mysql> show index from tblA;
+-------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name       | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| tblA  |          1 | idx_A_ageBirth |            1 | age         | A         |           3 |     NULL | NULL   | YES  | BTREE      |         |               |
| tblA  |          1 | idx_A_ageBirth |            2 | birth       | A         |           3 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.01 sec)

mysql> explain select * from tblA where age > 20 order by age;
+----+-------------+-------+------------+-------+----------------+----------------+---------+------+------+----------+--------------------------+
| id | select_type | table | partitions | type  | possible_keys  | key            | key_len | ref  | rows | filtered | Extra                    |
+----+-------------+-------+------------+-------+----------------+----------------+---------+------+------+----------+--------------------------+
|  1 | SIMPLE      | tblA  | NULL       | index | idx_A_ageBirth | idx_A_ageBirth | 9       | NULL |    3 |   100.00 | Using where; Using index |
+----+-------------+-------+------------+-------+----------------+----------------+---------+------+------+----------+--------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from tblA where age > 20 order by age,birth;
+----+-------------+-------+------------+-------+----------------+----------------+---------+------+------+----------+--------------------------+
| id | select_type | table | partitions | type  | possible_keys  | key            | key_len | ref  | rows | filtered | Extra                    |
+----+-------------+-------+------------+-------+----------------+----------------+---------+------+------+----------+--------------------------+
|  1 | SIMPLE      | tblA  | NULL       | index | idx_A_ageBirth | idx_A_ageBirth | 9       | NULL |    3 |   100.00 | Using where; Using index |
+----+-------------+-------+------------+-------+----------------+----------------+---------+------+------+----------+--------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from tblA where age > 20 order by birth;
+----+-------------+-------+------------+-------+----------------+----------------+---------+------+------+----------+------------------------------------------+
| id | select_type | table | partitions | type  | possible_keys  | key            | key_len | ref  | rows | filtered | Extra                                    |
+----+-------------+-------+------------+-------+----------------+----------------+---------+------+------+----------+------------------------------------------+
|  1 | SIMPLE      | tblA  | NULL       | index | idx_A_ageBirth | idx_A_ageBirth | 9       | NULL |    3 |   100.00 | Using where; Using index; Using filesort |
+----+-------------+-------+------------+-------+----------------+----------------+---------+------+------+----------+------------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from tblA where age > 20 order by birth,age;
+----+-------------+-------+------------+-------+----------------+----------------+---------+------+------+----------+------------------------------------------+
| id | select_type | table | partitions | type  | possible_keys  | key            | key_len | ref  | rows | filtered | Extra                                    |
+----+-------------+-------+------------+-------+----------------+----------------+---------+------+------+----------+------------------------------------------+
|  1 | SIMPLE      | tblA  | NULL       | index | idx_A_ageBirth | idx_A_ageBirth | 9       | NULL |    3 |   100.00 | Using where; Using index; Using filesort |
+----+-------------+-------+------------+-------+----------------+----------------+---------+------+------+----------+------------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from tblA  order by birth;
+----+-------------+-------+------------+-------+---------------+----------------+---------+------+------+----------+-----------------------------+
| id | select_type | table | partitions | type  | possible_keys | key            | key_len | ref  | rows | filtered | Extra                       |
+----+-------------+-------+------------+-------+---------------+----------------+---------+------+------+----------+-----------------------------+
|  1 | SIMPLE      | tblA  | NULL       | index | NULL          | idx_A_ageBirth | 9       | NULL |    3 |   100.00 | Using index; Using filesort |
+----+-------------+-------+------------+-------+---------------+----------------+---------+------+------+----------+-----------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from tblA where  birth > '2016-01-28 00:00:00' order by birth;
+----+-------------+-------+------------+-------+---------------+----------------+---------+------+------+----------+------------------------------------------+
| id | select_type | table | partitions | type  | possible_keys | key            | key_len | ref  | rows | filtered | Extra                                    |
+----+-------------+-------+------------+-------+---------------+----------------+---------+------+------+----------+------------------------------------------+
|  1 | SIMPLE      | tblA  | NULL       | index | NULL          | idx_A_ageBirth | 9       | NULL |    3 |    33.33 | Using where; Using index; Using filesort |
+----+-------------+-------+------------+-------+---------------+----------------+---------+------+------+----------+------------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from tblA where  birth > '2016-01-28 00:00:00' order by age;
+----+-------------+-------+------------+-------+---------------+----------------+---------+------+------+----------+--------------------------+
| id | select_type | table | partitions | type  | possible_keys | key            | key_len | ref  | rows | filtered | Extra                    |
+----+-------------+-------+------------+-------+---------------+----------------+---------+------+------+----------+--------------------------+
|  1 | SIMPLE      | tblA  | NULL       | index | NULL          | idx_A_ageBirth | 9       | NULL |    3 |    33.33 | Using where; Using index |
+----+-------------+-------+------------+-------+---------------+----------------+---------+------+------+----------+--------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from tblA order by age asc,birth desc;
+----+-------------+-------+------------+-------+---------------+----------------+---------+------+------+----------+-----------------------------+
| id | select_type | table | partitions | type  | possible_keys | key            | key_len | ref  | rows | filtered | Extra                       |
+----+-------------+-------+------------+-------+---------------+----------------+---------+------+------+----------+-----------------------------+
|  1 | SIMPLE      | tblA  | NULL       | index | NULL          | idx_A_ageBirth | 9       | NULL |    3 |   100.00 | Using index; Using filesort |
+----+-------------+-------+------------+-------+---------------+----------------+---------+------+------+----------+-----------------------------+
1 row in set, 1 warning (0.00 sec)

理论

  • MySQL支持两种方式的排序

    • FileSort和Index,Index效率高。FileSort方式效率较低。
    • Using Index,它指MySQL扫描索引本身完成排序。
  • ORDER BY满足两种情况,会使用Index方式排序:

    • ORDER BY语句使用索引最左前列
    • 使用Where子句(只能是常量)与ORDER BY子句条件列组合满足索引最左前列
  • 如果不在索引列上,filesort有两种算法:mysql就要启动双路排序和单路排序。

    • 双路排序
      • MySQL4.1之前是使用双路排序,字面意思就是两次扫描磁盘,最终得到数据。读取行指针和order by列,对他们进行排序,然后扫描已经排好序的列表,按照列表中的值重新从列表中读取对应的数据输出。
      • 从磁盘取排序字段,在buffer进行排序,再从磁盘读取其他字段。
      • 取一批数据,要对磁盘进行了两次扫描,众所周知,I\O是很耗时的,所以在mysql4.1之后,出现了第二种改进的算法,就是单路排序
    • 单路排序
      • 从磁盘读取查询需要的所有列,按照order by列在buffer对它们进行排序,然后扫描排序后的列表进行输出,它的效率更快一些,避免了第二次读取数据。并且把随机IO变成了顺序IO,但是它会使用更多的空间。
    • 结论及引申出的问题
      • 由于单路是后出的,总体而言好过双路
      • 但是用单路有问题
        • 本来想省一次I/O操作,反而导致了大量的I/O操作,反而得不偿失。(原因:数据的总大小超过sort_buffer的容量)-
  • 单路复用算法的优化策略:

    • 增大sort_buffer_size参数的设置。
    • 增大max_length_for_sort_data参数的设置。
  • 提高ORDER BY排序的速度:

    • ORDER BY时使用SELECT *是大忌,查什么字段就写什么字段,这点非常重要。在这里的影响是:

      • 当查询的字段大小总和小于max_length_for_sort_data而且排序字段不是TEXT|BLOB类型时,会使用单路排序算法,否则使用多路排序算法。
      • 两种排序算法的数据都有可能超出sort_buffer缓冲区的容量,超出之后,会创建tmp临时文件进行合并排序,导致多次IO,但是单路排序算法的风险会更大一些,所以要增大sort_buffer_size参数的设置。
    • 尝试提高sort_buffer_size:不管使用哪种算法,提高这个参数都会提高效率,当然,要根据系统的能力去提高,因为这个参数是针对每个进程的。

    • 尝试提高max_length_for_sort_data:提高这个参数,会增加用单路排序算法的概率。但是如果设置的太高,数据总容量sort_buffer_size的概率就增大,明显症状是高的磁盘IO活动和低的处理器使用率。

小总结

/* 创建a b c三个字段的索引 */
idx_table_a_b_c(a, b, c)

/* 1.ORDER BY 能使用索引最左前缀 */
ORDER BY a;
ORDER BY a, b;
ORDER BY a, b, c;
ORDER BY a DESC, b DESC, c DESC;

/* 2.如果WHERE子句中使用索引的最左前缀定义为常量,则ORDER BY能使用索引 */
WHERE a = 'Ringo' ORDER BY b, c;
WHERE a = 'Ringo' AND b = 'Tangs' ORDER BY c;
WHERE a = 'Ringo' AND b > 2000 ORDER BY b, c;

/* 3.不能使用索引进行排序 */
ORDER BY a ASC, b DESC, c DESC;  /* 排序不一致 */
WHERE g = const ORDER BY b, c;   /* 丢失a字段索引 */
WHERE a = const ORDER BY c;      /* 丢失b字段索引 */
WHERE a = const ORDER BY a, d;   /* d字段不是索引的一部分 */
WHERE a IN (...) ORDER BY b, c;  /* 对于排序来说,多个相等条件(a=1 or a=2)也是范围查询 */

GORUP BY优化

  • GROUP BY实质是先排序后进行分组,遵照索引建的最佳左前缀。

  • 当无法使用索引列时,会使用Using filesort进行排序,增大max_length_for_sort_data参数的设置和增大sort_buffer_size参数的设置,会提高性能。

  • WHERE执行顺序高于HAVING,能写在WHERE限定条件里的就不要写在HAVING中了。

慢查询日志

概念

  • MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
  • long_query_time的默认值是10,意思是运行10秒以上的语句。
  • 由它来查看哪些SQL超出了我们的最大忍耐时间值,比如一条sql执行超过5秒钟,我们就算慢SQL,希望能收集超过5秒的sql,结合之前的explain进行全面分析。

特别说明

  • 默认情况下,MySQL数据库没有开启慢查询日志需要我们手动来设置这个参数。

  • 当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件。

慢查询日志的操作

命令

  • 查看慢查询日志是否开启:SHOW VARIABLES LIKE ‘%slow_query_log%’;。
  • 开启慢查询日志:SET GLOBAL slow_query_log = 1;
  • 关于慢查询的参数slow_query_log_file,它指定慢查询日志文件的存放路径,系统默认会给一个缺省的文件host-name-slow.log(如果没有指定参数slow_query_log_file的话)
# 1、查看慢查询日志是否开启
mysql> SHOW VARIABLES LIKE '%slow_query_log%';
+---------------------+--------------------------------------+
| Variable_name       | Value                                |
+---------------------+--------------------------------------+
| slow_query_log      | OFF                                  |
| slow_query_log_file | /var/lib/mysql/1dcb5644392c-slow.log |
+---------------------+--------------------------------------+
2 rows in set (0.01 sec)

# 2、开启慢查询日志
mysql> SET GLOBAL slow_query_log = 1;
Query OK, 0 rows affected (0.00 sec)

  • 开启了慢查询日志后,什么样的SQL才会被记录到慢查询日志里面呢?这个是由参数long_query_time控制的,默认情况下long_query_time的值为10秒(是大于,而不是大于等于)

  • MySQL中查看long_query_time的时间:SHOW VARIABLES LIKE ‘long_query_time%’;。

    • 为什么设置后看不出变化(设置3之后,查询依然显示10):需要重新连接或新开一个会话才能看到修改值。
# 查看long_query_time 默认是10秒
# 只有SQL的执行时间>10才会被记录
mysql> SHOW VARIABLES LIKE 'long_query_time%';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)

在这里插入图片描述

  • 慢查询日志的总记录条数:SHOW GLOBAL STATUS LIKE ‘%Slow_queries%’;。
mysql> SHOW GLOBAL STATUS LIKE '%Slow_queries%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries  | 3     |
+---------------+-------+
1 row in set (0.00 sec)

配置文件(永久)

# my.cnf
[mysqld]
# 1.这个是开启慢查询。注意ON需要大写
slow_query_log=ON  

# 2.这个是存储慢查询的日志文件。这个文件不存在的话,需要自己创建
slow_query_log_file=/var/lib/mysql/slow.log

# 3.这个是设置慢查询的时间,设置为3秒(是大于,而不是大于等于)
long_query_time=3

# 4.日志类型
log_output=FILE

# 5.重启mysql

案列

在这里插入图片描述

日志分析工具

  • 在生产环境中,如果要手工分析日志,查找、分析SQL,显然是个体力活,MySQL提供了日志分析工具mysqldumpslow。
  • mysqldumpslow --help,查看mysqldumpslow的帮助信息
    • s:是表示按照何种方式排序
    • c:访问次数
    • I:锁定时间
    • r:返回记录
    • t:查询时间
    • al:平均锁定时间
    • ar:平均返回记录数
    • at:平均查询时间
    • t:即为返回前面多少条的数据
    • g:后边搭配一个正则匹配模式,大小写不敏感
# 2、 案例
# 2.1、得到返回记录集最多的10个SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/slow.log
 
# 2.2、得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/slow.log
 
# 2.3、得到按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/slow.log

# 2.4、另外建议使用这些命令时结合|和more使用,否则出现爆屏的情况
mysqldumpslow -s r -t 10 /var/lib/mysql/slow.log | more

批量插入数据脚本

环境准备

  • 由于开启过慢查询日志,开启了bin-log,我们就必须为function指定一个参数,否则使用函数会报错。
# 在mysql中设置 
# log_bin_trust_function_creators 默认是关闭的 需要手动开启
mysql> SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | OFF   |
+---------------------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL log_bin_trust_function_creators=1;
Query OK, 0 rows affected (0.00 sec)

[mysqld]
log_bin_trust_function_creators=ON

创建函数

# 1、函数:随机产生字符串
DELIMITER $$
CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
BEGIN
    DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    DECLARE return_str VARCHAR(255) DEFAULT '';
    DECLARE i INT DEFAULT 0;
    WHILE i < n DO
    SET return_str = CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));
    SET i = i + 1;
    END WHILE;
    RETURN return_str;
END $$

# 2、函数:随机产生部门编号
DELIMITER $$
CREATE FUNCTION rand_num() RETURNS INT(5)
BEGIN
    DECLARE i INT DEFAULT 0;
    SET i = FLOOR(100 + RAND() * 10);
    RETURN i;
END $$

创建存储过程

# 1、函数:向dept表批量插入
DELIMITER $$
CREATE PROCEDURE insert_dept(IN START INT(10),IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
    SET autocommit = 0;
    REPEAT
    SET i = i + 1;
    INSERT INTO dept(deptno,dname,loc) VALUES((START + i),rand_string(10),rand_string(8));
    UNTIL i = max_num
    END REPEAT;
    COMMIT;
END $$

# 2、函数:向emp表批量插入
DELIMITER $$
CREATE PROCEDURE insert_emp(IN START INT(10),IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
    SET autocommit = 0;
    REPEAT
    SET i = i + 1;
    INSERT INTO emp(empno,ename,job,mgr,hiredata,sal,comm,deptno) VALUES((START + i),rand_string(6),'SALESMAN',0001,CURDATE(),2000,400,rand_num());
    UNTIL i = max_num
    END REPEAT;
    COMMIT;
END $$

调用存储过程

# 1、调用存储过程向dept表插入10个部门。
DELIMITER ;
CALL insert_dept(100,10);

# 2、调用存储过程向emp表插入50万条数据。
DELIMITER ;
CALL insert_emp(100001,500000);

Show Profile

概念

  • Show Profile:MySQL提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量。
  • 默认情况下,参数处于关闭状态,并保存最近15次的运行结果。

分析步骤

  • 是否支持,看看当前的MySQL版本是否支持。
# 查看Show Profile功能是否开启
mysql> SHOW VARIABLES LIKE 'profiling';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| profiling     | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

  • 开启Show Profile功能,默认是关闭的,使用前需要开启。
# 开启Show Profile功能
mysql> SET profiling=ON;
Query OK, 0 rows affected, 1 warning (0.00 sec)

运行SQL-模拟

SELECT * FROM `emp` GROUP BY `id`%10 LIMIT 150000;

SELECT * FROM `emp` GROUP BY `id`%20 ORDER BY 5;

查看结果,执行SHOW PROFILES

mysql>  SHOW PROFILES;
+----------+------------+---------------------------------------------------+
| Query_ID | Duration   | Query                                             |
+----------+------------+---------------------------------------------------+
|        1 | 0.62360600 | SELECT * FROM `emp` GROUP BY `id`%10 LIMIT 150000 |
|        2 | 0.59990050 | SELECT * FROM `emp` GROUP BY `id`%20 ORDER BY 5   |
+----------+------------+---------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)

诊断SQL,SHOW PROFILE cpu,block io FOR QUERY Query_ID[上一步前面的问题SQL数字号码];

mysql> SHOW PROFILE cpu,block io FOR QUERY 1;
+----------------------+----------+----------+------------+--------------+---------------+
| Status               | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |
+----------------------+----------+----------+------------+--------------+---------------+
| starting             | 0.000064 | 0.000060 |   0.000000 |            0 |             0 |
| checking permissions | 0.000009 | 0.000008 |   0.000000 |            0 |             0 |
| Opening tables       | 0.000020 | 0.000019 |   0.000000 |            0 |             0 |
| init                 | 0.000026 | 0.000026 |   0.000000 |            0 |             0 |
| System lock          | 0.000008 | 0.000008 |   0.000000 |            0 |             0 |
| optimizing           | 0.000006 | 0.000006 |   0.000000 |            0 |             0 |
| statistics           | 0.000032 | 0.000033 |   0.000000 |            0 |             0 |
| preparing            | 0.000012 | 0.000012 |   0.000000 |            0 |             0 |
| Creating tmp table   | 0.000030 | 0.000030 |   0.000000 |            0 |             0 |
| Sorting result       | 0.000006 | 0.000005 |   0.000000 |            0 |             0 |
| executing            | 0.000005 | 0.000005 |   0.000000 |            0 |             0 |
| Sending data         | 0.623172 | 0.547154 |   0.000000 |         6968 |             0 |
| Creating sort index  | 0.000051 | 0.000045 |   0.000000 |            0 |             0 |
| end                  | 0.000007 | 0.000007 |   0.000000 |            0 |             0 |
| query end            | 0.000010 | 0.000009 |   0.000000 |            0 |             0 |
| removing tmp table   | 0.000007 | 0.000007 |   0.000000 |            0 |             0 |
| query end            | 0.000005 | 0.000005 |   0.000000 |            0 |             0 |
| closing tables       | 0.000007 | 0.000007 |   0.000000 |            0 |             0 |
| freeing items        | 0.000112 | 0.000114 |   0.000000 |            0 |             0 |
| cleaning up          | 0.000021 | 0.000018 |   0.000000 |            0 |             0 |
+----------------------+----------+----------+------------+--------------+---------------+
20 rows in set, 1 warning (0.00 sec)

Show Profile查询参数备注:

  • ALL:显示所有的开销信息。
  • BLOCK IO:显示块IO相关开销(通用)。
  • CONTEXT SWITCHES:上下文切换相关开销。
  • CPU:显示CPU相关开销信息(通用)。
  • IPC:显示发送和接收相关开销信息。
  • MEMORY:显示内存相关开销信息。
  • PAGE FAULTS:显示页面错误相关开销信息。
  • SOURCE:显示和Source_function。
  • SWAPS:显示交换次数相关开销的信息。

Show Profile查询列表,日常开发需要注意的结论:

  • converting HEAP to MyISAM:查询结果太大,内存都不够用了,往磁盘上搬了。
  • Creating tmp table:创建临时表(拷贝数据到临时表,用完再删除),非常耗费数据库性能。
  • Copying to tmp table on disk:把内存中的临时表复制到磁盘,危险!!!
  • locked:死锁。

在这里插入图片描述

全局查询日志-少用

  • 永远不要在生产环境开启这个功能!

  • 配置启用
    在这里插入图片描述

  • 编码启用
    在这里插入图片描述

mysql高级(尚硅谷周阳) mysql高级mysql的架构分析 mysql的架构分析 mysql 高级(包括) (很多公司的mysql的优化有专门的DBA) Mysql高级 sql优化攻城狮 mysql服务器的优化 各种参数常量的设定 查询语句优化 主从复制 软硬件升级 容灾备份 sql编程 这里注意视频那个启动mysql老了应该用 service mysqld start mysql逻辑架构 mysql支持多种存储引擎 与其他数据库相比, mysql有点与众不同, 他的架构可以在多种不同场景中应用并发挥良好的作用, 主要体 阅读详情

相关推荐

尚硅谷MySQL数据库笔记

数据库的相关概念 MySQL是一种DBMS(数据库管理系统),安装数据库=安装数据库管理系统。 SQL:结构化查询语言(Structure Query Language),专门用来与数据库通信的语言。 不是某个特定数据库供应商专有的语是言,几乎所有DBMS都支持SQL 简单易学 实际上强有力的语言,灵活使用可以进行非常复杂和高级的数据库操作 安装与启动 https://downloads.mysql.com/archives/community/下载安装,我选用的版本是5.7.31,在系统偏好设置

weixin_42093700的博客 894

MySql (4)-储存引擎、索引、锁、集群

MySQL高级 一、MySQL存储引擎 1.MySQL体系结构 体系结构的概念 任何一套系统当中,每个部件都能起到一定的作用! MySQL的体系结构 体系结构详解 客户端连接 支持接口:支持的客户端连接,例如C、Java、PHP等语言来连接MySQL数据库 第一层:网络连接层 连接池:管理、缓冲用户的连接,线程处理等需要缓存的需求。 例如:当客户端发送一个请求连接,会从连接池中获取一个连接进行使用。 第二层:核心服务层 管理服务和工具:系统的管理和控制工具,例如备份恢复、

Huonly 509

Mysql优化高级篇(全)

目录前言1. 简介1.1 安装1.2 MySQL逻辑架构存储引擎2. 索引优化分析2.1 原因2.2 常见通用的join查询2.3 索引2.3.1 索引分类2.3.2 索引结构2.3.3 索引情况2.4 性能分析2.4.1 id 前言 本篇文章主要涉及mysql的高级篇,主要是mysql的架构介绍、索引优化分析、查询截取分析、mysql锁机制以及主从复制等 在这之前的学习可参考我之前的文章进行学习 数据库知识 链接 数据库查询常用语句语法 博客链接 数据库中增删改常用语法语句(全) 博客

码农研究僧的博客 9078

mysql锁研究系列四(事务在并发情况下避免超卖)

我们在做电商的时候会考虑到一个问题,如果此时库存就剩一个,而来了两个并发同时下单,如何避免库存超卖? 先贴一段代码: beginTranse(开启事务) $sql = "select * from goods where title='测试商品'"; $tmp = $db->query($sql); $info= $db->fetch_assoc($tmp);

只知其一,等于一无所知 2543

【Elasticsearch专栏 16】深入探索:Elasticsearch的Master选举机制及其影响因素分析

Elasticsearch的Master选举机制是其分布式架构的基石,确保集群高可用性和数据一致性。通过多数派协议,节点间交换信息并投票选举Master,以维护集群状态和处理请求。该机制自动处理故障转移,保障服务连续性。

weixin_40736233的博客 1774

FFmpeg音频转换避坑实录:为什么VOS的REC转MP3比WAV转MP3体积小一半?

本文深入解析了FFmpeg在VOS系统REC格式音频转换中的优化技巧,揭示了REC转MP3比WAV转MP3体积小一半的原因。通过分析REC格式的压缩特性、转码参数陷阱及FFmpeg调优方法,帮助开发者实现高效音频转换,显著降低存储成本。

weixin_30752699的博客 526

从MySQL中读取股票数据——从零到实盘10

前文介绍了把股票数据写入MySQL的过程,本文记录从MySQL中读取股票数据的过程。 到目前为止,我们在访问股票代码列表时,每次需要通过BaoStock重新下载。本文将把下载的股票代码保存到MySQL中,在后续访问股票列表时,就可以通过MySQL读取股票代码数据,从而避免每次都要重新下载代码列表,也以此来演示从MySQL中读取数据的过程。 主要代码分析 新建源文件,命名为data_center_v8.py,全部内容见文末,v8主要修改了函数get_stock_codes: def get_stock_co.

码农甲的博客 7519

2023年数学建模国赛三大赛题核心建模思路与实战代码全解

本文全面解析2023年数学建模国赛三大赛题的核心建模思路与实战代码,涵盖塔式太阳能光热发电系统优化、多波束测深系统动态规划及蔬菜商品化策略建模。通过Python代码示例和优化算法(如遗传算法、NSGA2)展示,帮助参赛者掌握数学建模的关键技术与实战技巧,提升竞赛成绩。

weixin_33713350的博客 331

尚硅谷MySQL高级学习笔记

数据库MySQL学习笔记高级篇 文章目录数据库MySQL学习笔记高级篇写在前面1. mysql的架构介绍mysql简介概述高级MysqlmysqlLinux版的安装mysql配置文件mysql逻辑架构介绍mysql存储引擎2. 索引优化分析性能下降SQL慢常见通用的Join查询索引简介性能分析索引优化3. 查询截取分析查询优化慢查询日志批量数据脚本Show Profile全局查询日志4. MySQ...

李英俊小朋友 2万+

通讯接口应用笔记3:使用W5500实现Modbus TCP服务器

  前面我们设计实现了W5500的驱动程序,也讲解了驱动的使用方式。在最近一次的项目应用中,正好有一个使用W5500实现TCP通讯的需求,所以我们就使用该驱动程序轻松实现。这一篇中我们就来说一说基于我们W5500通讯驱动程序实现TCP通讯的过程。 1、应用需求   在本次应用中,要求实现一个基于W5500的Modbus TCP服务器。这个需求的描述虽然只有一句话,但是这个需求的内容可不简单。我们首先来分析一下这个需求的具体内容。   为了实现基于W5500的Modbus TCP服务器,我们必先须基于W550

木南创智 5495

基因家族Motif 分析

MEME

hgz2020的博客 6314

尚硅谷—高级—MySQL数据库高级

`ali_database`SELECT * FROM student SELECT COUNT(1),userRole FROM student GROUP BY userRole SELECT COUNT(1),userRole FROM student GROUP BY userRole ORDER BY COUNT(*) SELECT COUNT(*),NAME,userRole FROM student WHERE 1=1 GROUP BY NAME,userRole ORDER BY ..

张老师的博客 1670

【代码】获取高级行情数据,并通过 qmt 进行实际下单交易,自动实现止盈止损管理

【代码】获取高级行情数据,并通过 qmt 进行实际下单交易,自动实现止盈止损管理

XD1996CD的博客 4108

MySQL技术高级篇-B站尚硅谷

B站尚硅谷MySQL技术高级篇 1.MySQL架构介绍 MYsql安装 查看mysql是否已经安装 rpm -qa|grep mysql ps -ef |grep mysql mysqladmin -version mysql安装完成后会有密码与用户组记录 cat /etc/passwd|grep mysql cat /etc/group|grep mysql Mysql启动与暂停,开机启动 service mysql start systemctl start mysql service mysql s

羽风的博客 615

ESP32-C3入门教程 蓝牙篇①——基于Blufi 的 WiFi 智能配网

文章目录一、前言二、WiFi配网方式三、快速运行四、运行效果五、ESP32-C3程序流程5.1 主程序5.2 回调函数5.3 SmartConfig线程5.4 流程图六、关键函数6.1 设置SmartConfig的协议类型6.2 启动SmartConfig6.3 停止SmartConfig七、其他八、参考 一、前言 本文基于VS Code IDE进行编程、编译、下载、运行等操作 基础知识点请查阅:ESP32-C3入门教程 基础篇①——基于VS Code构建Hello World 二、WiFi配网方式 W

7763

PCB板Gerber文件的理解和制作

Gerber文件是PCB生产的关键文件,主要包括:1)走线层(GTL/GBL);2)阻焊层(GTS/GBS);3)丝印层(GTO/GBO);4)板框层(GMx/GKO);5)钢网层(Gtp/GBp);6)钻孔文件(NCdrillFiles)。其中1-10项和15项钻孔文件必须提供,建议包含11-14项辅助钻孔层。Gerber文件不含过孔属性,需提前在AD中设置过孔盖油。导出步骤包括:导出非机械层、机械层和钻孔层,新版AD可通过"文件->制造输出->GerberFiles"操作

qq_37999850的博客 852

尚硅谷MySQL高级学习笔记 -- 4.查询截取分析

1、查询优化 1.1、MySQL 优化原则 mysql 的调优大纲 慢查询的开启并捕获explain+慢SQL分析show profile查询SQL在Mysql服务器里面的执行细节和生命周期情况SQL数据库服务器的参数调优 永远小表驱动大表,类似嵌套循环 Nested Loop EXISTS 语法: SELECT ... FROM table WHERE EXISTS(subquery)该语法可以理解为:将查询的数据,放到子查询中做条件验证,根据验证结果(TRUE或FALSE)来决定主查询的数据结果

exodus3的博客 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

尚硅谷MySQL数据库高级-目录

尚硅谷MySQL数据库高级-01-mysq1的架构介绍 尚硅谷MySQL数据库高级-02-索引优化分析 尚硅谷MySQL数据库高级-03-查询截取分析 尚硅谷MySQL数据库高级-04-MySQL锁机制 尚硅谷MySQL数据库高级-05-主从复制 ...

admin741admin的博客 215

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

mysql高级优化(全)-尚硅谷

Mysql高级优化-尚硅谷篇(全)

小万是个程序员 2358

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

尚硅谷MySQL课程笔记

索引是帮助 MySQL 高效获取数据的数据结构。“排好序的快速查找数据结构”为了加快数据查找,可以维护下图所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以利用二叉查找在一定的复杂度内获取到相应数据,从而快速的检索出符合条件的记录。一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。我们平常的索引,如果没有特别指定,都是指 B 树(多路搜索树,并不一定是二叉的)结构组织的索引。

gjhuai的专栏 1791

“尚硅谷”Mysql数据库DQL

DB,DBMS,的概念 “+” 的使用 在mysql中,"+“并不能对字段值进行拼接操作,”+"只能作为运算符来使用。 mysql字符拼接使用拼接函数concat mysql数据库中字符串和字符并无区别 #两个操作数都为数值型,做加法运算。 select 100+90;#190 #其中一方为字符型,试图将字符型数值转换成数值型。 #转换成功,继续做加法运算。 #转换失败,将字符型数值转换为0. select '100'+90;#190 select 'jack'+90;#90 #其中一方为null,结果

weixin_42902126的博客 351

mysql高级--查询截取分析

文章目录SQL优化步骤1、查询优化1.1 order by优化1.2 group by关键字优化2、慢日志查询2.1 使用慢日志查询2.2 日志分析工具mysqldumpslow3、Show Profile4、全局查询日志 【笔记于学习尚硅谷课程所作】 SQL优化步骤 慢查询的开启并捕获 explain+慢SQL分析 showprofile查询SQL在Mysq1服务器里面的执行细节和生命周期...

一个巨大的博客 373

尚硅谷MySQL基础复习笔记

MySQL基础复习笔记 学习视频 1.基础知识 数据库优势: 持久化数据; 方便检索; 存储大量数据; 共享安全; 通过组合分子,获取新的数据; 相关概念: 数据(Data):是数据库中存储的基本对象。 数据库(Database,DB):数据库是长期储存在计算机内,有组织、可共享、大量的数据集合。 数据库管理系统(Database Management System,DBMS):数据库管理系统是介于用户和操作系统之间的数据管理软件。 SQL(StructureQueryLanguage)机构化

qq_39457586的博客 739

mysql高级学习(跟着尚硅谷老师周阳学习)

跟着b站尚硅谷老师学习mysql高级教程

M1275601161的博客 1130
上一篇: 尚硅谷MySQL数据库高级-02-索引优化分析
下一篇: 尚硅谷MySQL数据库高级-04-MySQL锁机制
zgcadmin
博客等级 码龄9年 174粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值