在某些数据访问层框架中,会使用show full tables from test like 'demo',来检查数据库的状态。当数据库中表的数量较少时,并没有出现严重的问题。但是当数据库中的表数量多余千个时,且并发数较高时,通过show processlist就会发现show full tables语句绝大部分处于checking permissions状态

| 2 | test | 192.168.15.128:57656 | NULL | Query | 0 | checking permissions | show full tables from test like '%demo%' |

| 3 | test | 192.168.15.128:57657 | NULL | Query | 0 | checking permissions | show full tables from test like '%demo%' |

| 4 | test | 192.168.15.128:57658 | NULL | Sleep | 0 | | NULL |

| 5 | test | 192.168.15.128:57659 | NULL | Query | 0 | Sending to client | show full tables from test like '%demo%' |

| 6 | test | 192.168.15.128:57662 | NULL | Query | 0 | checking permissions | show full tables from test like '%demo%' |

| 7 | test | 192.168.15.128:57661 | NULL | Query | 0 | checking permissions | show full tables from test like '%demo%' |

| 8 | test | 192.168.15.128:57660 | NULL | Query | 0 | checking permissions | show full tables from test like '%demo%' |

| 9 | test | 192.168.15.128:57663 | NULL | Query | 0 | checking permissions | show full tables from test like '%demo%' |

| 10 | test | 192.168.15.128:57664 | NULL | Query | 0 | checking permissions | show full tables from test like '%demo%' |

| 11 | test | 192.168.15.128:57665 | NULL | Query | 0 | checking permissions | show full tables from test like '%demo%' |

| 12 | test | 192.168.15.128:57666 | test | Query | 0 | starting | show processlist |

从给出的状态信息来看,很多人会误以为这是在该SQL需要做复杂的权限检查。google一下之后,发现也有人遇到类似的问题,并认为是mysql.user表中的条目数过多。但是我本机中,显然不是这个原因。

mysql> select count(*) from mysql.user;

+----------+

| count(*) |

+----------+

| 5           |

+----------+

1 row in set (0.00 sec)

由于show full tables from test like '%demo%'需要检查test数据库下的所有frm文件,因此表的数量越多,就越有可能出现这个问题。为了验证,我在两个实例上分别创建一个表和创建2000个表

一个表时,

mysql> set profiling=1;

Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show full tables from test like 'demo';

+-----------------------+------------+

| Tables_in_test (demo) | Table_type |

+-----------------------+------------+

| demo | BASE TABLE |

+-----------------------+------------+

1 row in set (0.00 sec)

mysql> show profile;

+----------------------+----------+

| Status | Duration |

+----------------------+----------+

| starting | 0.000227 |

| checking permissions | 0.000020 |

| checking permissions | 0.000023 |

| Opening tables | 0.000452 |

| init | 0.000078 |

| System lock | 0.000051 |

| optimizing | 0.000030 |

| statistics | 0.000179 |

| preparing | 0.000134 |

| executing | 0.000069 |

| checking permissions | 0.000557 |

| Sending data | 0.000136 |

| end | 0.000036 |

| query end | 0.000032 |

| closing tables | 0.000042 |

| removing tmp table | 0.000110 |

| closing tables | 0.000060 |

| freeing items | 0.000122 |

| cleaning up | 0.000028 |

+----------------------+----------+

19 rows in set, 1 warning (0.01 sec)

2000个表时

mysql> set profiling=1;

Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show full tables from test like 'demo';

+-----------------------+------------+

| Tables_in_test (demo) | Table_type |

+-----------------------+------------+

| demo | BASE TABLE |

+-----------------------+------------+

1 row in set (0.01 sec)

mysql> show profile;

+----------------------+----------+

| Status | Duration |

+----------------------+----------+

| starting | 0.000083 |

| checking permissions | 0.000004 |

| checking permissions | 0.000002 |

| Opening tables | 0.000032 |

| init | 0.000008 |

| System lock | 0.000005 |

| optimizing | 0.000003 |

| statistics | 0.000104 |

| preparing | 0.000024 |

| executing | 0.000004 |

| checking permissions | 0.002991 |

| Sending data | 0.000014 |

| end | 0.000003 |

| query end | 0.000005 |

| closing tables | 0.000002 |

| removing tmp table | 0.000003 |

| closing tables | 0.000002 |

| freeing items | 0.000047 |

| cleaning up | 0.000013 |

+----------------------+----------+

19 rows in set, 1 warning (0.01 sec)

0.002991/0.000557=5.36,其所消耗时间增长了5倍以上,在高并发下,其现象更明显。

那么标注为红色的checking permission是否真正表示在做权限检查了,答案是否定的。

通过检查MySQL5.6源码,可以发现,在执行show full tables from test like '%demo%'时,checking permission期间其实做了两部分工作,

1、检查权限

2、遍历test数据库下所有的frm文件,并获取相关信息。根据获得的信息,经过like条件过滤后,写入到一个临时表(memory引擎表)中

在sending data阶段,从这个临时表,把数据发送给用户

因此在某些SQL语句下,状态为checking permission时,并不一定真的在做权限检查。

所以不要频繁的向数据库发送show full tables from test like '%demo%',尤其是在表的数量很多时。

mysql checking_高并发下MySQL出现checking permissions相关推荐

  1. MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性

    原文:MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性 作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe1 ...

  2. mysql高可靠部署_可能是我见过最好的 MySQL 高可用解决方案 MySQL InnoDB Cluster 中文教程!...

    公众号关注 「运维之美」设为「星标」,每天带你玩转 Linux ! 这篇文章将详细地介绍 MySQL 的高可用解决方案-- MySQL InnoDB Cluster. 说到高可用性,首先要了解一下什么 ...

  3. MySql的高可用方案

    MySql的高可用方案 mysql架构的重要性 一.MYSQL主从架构 1.环境介绍 2.搭建主从集群 2.1.理论基础 2.2 主从同步原理 2.3.配置mysql主库(master) 2.3.配置 ...

  4. MySQL主流高可用解决方案有_高可用MySQL解决方案概述

    数据库作为最基础的数据存储服务之一,在存储系统中有着非常重要的地位,因此要求其具备高可用性无可厚非.能实现不同SLA(服务水平协定)的解决方案有很多种,这些方案可以保证数据库服务器在硬件或软件出现故障 ...

  5. mysql高并发下主键冲突

    事情是这样的,博主刚刚写完一个小项目,由于使用的量比较大,所以做了一下压测,在插入数据的时候报出了如下错误 : [http-bio-****-exec-67] DEBUG c.j.m.a.d.A.in ...

  6. php mysql 秒杀_redis+PHP实现高并发下秒杀数据入库的问题

    在高并发下实现抢购秒杀功能中,我有一个疑问,就是数据入库的问题,什么时候入库. 设想思路: 1.判断他抢购成功了,立马把生成的订单数据写入mysql订单表,同时库存表字段减少1: 2.判断抢购成功后, ...

  7. mysql分布式安装可靠读写案列图解,高并发下的分布式锁-mysql篇

    前言 不管是在面试中,还是在平时的工作中,高并发永远是衡量一个web工作者能力的重要场景.本篇幅我们主要是来讨论在高并发环境下我们应该如何实现分布式锁. 实现分布式锁的方式有比较多,这里主要考虑如何使 ...

  8. 玩转MySQL:了解高并发下保证数据安全的锁机制吗

    引言 锁!这个词汇在编程中出现的次数尤为频繁,几乎主流的编程语言都会具备完善的锁机制,在数据库中也并不例外,为什么呢?这里牵扯到一个关键词:高并发,由于现在的计算机领域几乎都是多核机器,因此再编写单线 ...

  9. mysql存入订单号不重复_MSSQL高并发下生成连续不重复的订单号

    一.确定需求 只要做过开发的基本上都有做过订单,只要做过订单的基本上都要涉及生成订单号,可能项目订单号生成规则都不一样,但是大多数规则都是连续增长. 所以假如给你一个这样的需求,在高并发下,以天为单位 ...

最新文章

  1. 腾讯云服务器配置JDK和Tomcat环境
  2. java面试必备小知识_Java面试应该准备的知识点系列一
  3. 序列化和反序列化的概念与延伸【详细解释 + 样例演示】
  4. spring AOP 之一:spring AOP功能介绍
  5. 贪心算法:跳跃游戏总结
  6. sass笔记 - 实战中颜色的玩法总结
  7. Linux怎么删掉ftp服务器,Linux怎么删掉ftp服务器
  8. 一级计算机选择题汇总,计算机一级考试选择题汇总.pdf
  9. php经典面试题与答案(转先锋教程网)
  10. 简述cookie增删改查的函数封装
  11. ubuntu网页邮箱服务器设置,ubuntu配置邮件服务器
  12. 三维空间内任意三点坐标求圆心、半径
  13. 整数平方一定大于零吗?
  14. CentOS7部署NFS服务
  15. app调起支付宝-后端预支付
  16. 树莓派 11 bullseye镜像官方源和国内源
  17. 思必驰宣布完成5亿元D轮融资 继续深化AI生态布局
  18. CentOS 7安装Docker
  19. PWM(脉冲宽度调制)的工作原理、分类及其应用
  20. JQuery实现随机抽奖

热门文章

  1. 50多岁学python_50万+Python 开发者的选择,这本书对零基础真是太太太友好了!!!...
  2. 【转】CMNET和CMWAP区别
  3. CTFHub技能树 Web-XSS 详解
  4. 学计算机的演员,南开大学计算机系到演员 张桐回顾“不安分”的青春
  5. ORB-SLAM2的安装及试运行
  6. c语言 log4c,LOG4C 的使用
  7. 一位软件工程师的6年总结
  8. 求根节点到叶节点数字之和(C语言)
  9. SDCC 2016·北京站年终收官巨献,五十位演讲嘉宾和议题大公布
  10. 计算机科学与技术答辩技巧,计算机专业毕业论文答辩自述稿