- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
在 MySQL 中,如果我们想查看实例当前正在执行的 SQL,常用的命令是SHOW PROCESSLIST.
但如果 SQL 过长的话,就会被截断。这时,我们一般会用SHOW FULL PROCESSLIST来查看完整的 SQL.
最近碰到一个 case,发现无论是使用 SHOW PROCESSLIST、SHOW FULL PROCESSLIST,还是 performance_schema.processlist 都无法获取完整的 SQL,反倒 information_schema.processlist 可以.
最后发现,SHOW FULL PROCESSLIST无法查看完整的 SQL 竟然与 performance_schema_show_processlist 参数有关.
SHOW PROCESSLIST默认是从线程管理器(Global_THD_manager)中获取线程信息.
这种实现方式会持有全局互斥锁。在负载高的场景,会对数据库的性能有一定的负面影响.
所以一般都推荐使用 performance_schema.processlist,这种方式不会持有全局锁.
在 MySQL 8.0.22 中,引入了 performance_schema_show_processlist 参数,可设置SHOW PROCESSLIST的实现方式.
当该参数设置为 ON 时,会使用 performance_schema.processlist 的实现方式.
当参数设置为 OFF(默认值) 时,会使用传统的实现方式.
下面我们看看 SHOW PROCESSLIST, information_schema.processlist, performance_schema.processlist 这三种不同的查询方式对 SQL 的长度限制.
因为 SQL 是在 INFO 列中存储的,所以,SQL 的最大长度实际上是由 INFO 列决定的.
SHOW PROCESSLIST的输出中 INFO 列的最大长度与 performance_schema_show_processlist 有关.
当 performance_schema_show_processlist 等于 OFF 时,无论是SHOW PROCESSLIST,还是SHOW FULL PROCESSLIST,调用的都是 mysqld_list_processes 函数.
// sql/sql_show.cc
void mysqld_list_processes(THD *thd, const char *user, bool verbose,
bool has_cursor) {
Item *field;
mem_root_deque<Item *> field_list(thd->mem_root);
Thread_info_array thread_infos(thd->mem_root);
size_t max_query_length =
(verbose ? thd->variables.max_allowed_packet : PROCESS_LIST_WIDTH);
Protocol *protocol = thd->get_protocol();
DBUG_TRACE;
...
field_list.push_back(field = new Item_empty_string("Info", max_query_length));
...
}
可以看到,INFO 列的最大长度由 max_query_length 决定,而 max_query_length 的取值又与 verbose 有关.
当执行SHOW FULL PROCESSLIST时, verbose 为 true,此时 max_query_length 等于 max_allowed_packet.
当执行SHOW PROCESSLIST时,verbose 为 false,此时 max_query_length 等于 PROCESS_LIST_WIDTH,而 PROCESS_LIST_WIDTH 是个常量,大小为 100.
constexpr const size_t PROCESS_LIST_WIDTH{100};
当 performance_schema_show_processlist 等于 ON 时,无论是SHOW PROCESSLIST,还是SHOW FULL PROCESSLIST,调用的都是build_processlist_query 函数.
// sql/sql_show_processlist.cc
bool build_processlist_query(const POS &pos, THD *thd, bool verbose) {
LEX_STRING info_len;
/*
Default Info field length is 100. Verbose field length is limited to the
size of the INFO columns in the Performance Schema.
*/
assert(PROCESS_LIST_WIDTH == 100);
if (verbose) {
if (lex_string_strmake(thd->mem_root, &info_len, "1024", 4)) return true;
} else {
if (lex_string_strmake(thd->mem_root, &info_len, "100", 3)) return true;
}
...
/* Info length is either "100" or "1024" depending on verbose */
Item_int *item_info_len = new (thd->mem_root) Item_int(pos, info_len);
if (item_info_len == nullptr) return true;
...
}
当执行SHOW FULL PROCESSLIST时, verbose 为 true,此时 info_len 等于 1024.
当执行SHOW PROCESSLIST时,verbose 为 false,此时 info_len 等于 100.
information_schema.processlist 表中 INFO 的长度是在Fill_process_list中限制的.
// sql/sql_show.cc
class Fill_process_list : public Do_THD_Impl {
...
void operator()(THD *inspect_thd) override {
/* INFO */
mysql_mutex_lock(&inspect_thd->LOCK_thd_query);
{
const char *query_str = nullptr;
size_t query_length = 0;
...
if (query_str) {
const size_t width = min<size_t>(PROCESS_LIST_INFO_WIDTH, query_length);
table->field[7]->store(query_str, width, inspect_thd->charset());
table->field[7]->set_notnull();
}
}
...
}
};
INFO 的长度取 PROCESS_LIST_INFO_WIDTH 和 query_length(SQL 的实际长度)的最小值.
所以,INFO 列的最大长度由 PROCESS_LIST_INFO_WIDTH 决定,而 PROCESS_LIST_INFO_WIDTH 也是个常量,值为 65535.
constexpr const size_t PROCESS_LIST_INFO_WIDTH{65535};
performance_schema.processlist 表中 INFO 的长度是在pfs_set_thread_info_vc中限制的.
// storage/perfschema/pfs.cc
void pfs_set_thread_info_vc(const char *info, uint info_len) {
pfs_dirty_state dirty_state;
PFS_thread *pfs = my_thread_get_THR_PFS();
if (likely(pfs != nullptr)) {
if (info_len > sizeof(pfs->m_processlist_info)) {
info_len = sizeof(pfs->m_processlist_info);
}
pfs->m_stmt_lock.allocated_to_dirty(&dirty_state);
if (info != nullptr && info_len > 0) {
memcpy(pfs->m_processlist_info, info, info_len);
}
pfs->m_processlist_info_length = info_len;
pfs->m_stmt_lock.dirty_to_allocated(&dirty_state);
}
}
可以看到,INFO 列的最大长度是由 pfs->m_processlist_info 决定的,而 m_processlist_info 是个字符数组,它的最大长度由 COL_INFO_SIZE 决定.
而 COL_INFO_SIZE 又等于 COL_INFO_CHAR_SIZE * 1。其中,COL_INFO_CHAR_SIZE 是一个常量,值为 1024.
// storage/perfschema/pfs_instr.h
char m_processlist_info[COL_INFO_SIZE];
// storage/perfschema/pfs_column_types.h
#define COL_INFO_CHAR_SIZE 1024
/** Size of INFO columns, in bytes. */
#define COL_INFO_SIZE (COL_INFO_CHAR_SIZE * 1)
如果查询的是 information_schema.processlist, INFO 列的最大长度是 65535.
如果查询的是 performance_schema.processlist,INFO 列的最大长度是 1024.
如果执行的是SHOW PROCESSLIST,无论 performance_schema_show_processlist 是 ON 还是 OFF, INFO 列的最大长度都是 100.
如果执行的是SHOW FULL PROCESSLIST, 。
最后此篇关于SHOWPROCESSLIST最多能显示多长的SQL?的文章就讲到这里了,如果你想了解更多关于SHOWPROCESSLIST最多能显示多长的SQL?的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
看来我又被一个简单的正则表达式卡住了。 我想要什么: 1 到 999 之间的数字 可选:逗号、符号 如果输入逗号,最少1位小数,最多3位小数点应该是presebt。 Allowed: 100 999,
我需要从两列中获取最大值并将其发送到第三列。这些列的大小都是统一的,但有时大小会有所不同,但它们都将从同一个单元格开始。例如: 5 8 - 6 2 - 6 5 - 带有破折号的列需要找到其他两个之间的
我在我的网站上有一张包含用户排名列的表格,排名是一个数字,我想选择排名最高的 3 个用户,所以我查看并搜索了我认为最好的查询是那:Link (正确答案的第二个查询),但我不明白查询,如果有人能一步一步
我正在尝试制作一个点击计数器,我想收集 24 小时内的总点击次数。无论最终用户位于哪个时区,这 24 小时都应该是固定值。在 24 小时内,数据库应更新为 +1 次点击计数,一旦达到 24 小时时间范
我有一个在典型共享主机上运行的 PHP + MySQL Web 应用程序,我想知道调用最多的查询是什么以及消耗的资源量是多少。这样,我将专注于最昂贵的查询以优化资源或检测优化不佳的查询。 例如: qu
这是我“尝试”从用户输入的数字中找到最大 2 个值的代码: #include using namespace std; void maximum2(int a, int& max1,int& max
我需要编写一个 Python 函数,从具有最多“o”字符的字符串中返回单词。例如,get_most_ooo_word(['aa ao ooo']) 应该返回 ['ooo'] 和 get_most_oo
我正在寻找一种哈希算法,以创建尽可能接近字符串的唯一哈希值 (max len = 255),从而生成一个长整数 (DWORD)。 我意识到26^255 >> 2^32,但也知道英语的单词数远少于2^3
我得到了一个仅由 's','t','u','v' 作为字符组成的字符串 T。我想找到长度为 |T| 的字符串数它最多与 T 不同 n 个位置。而且每个这样的字符串在三个不同的位置不能有相同的字符,这些
我有一群“专家”(大约 300 人)可以胜任一项工作。而且我有很多工作必须完成,比如说大约 500 个。我也有信息,一个专家能做某项工作有多“好”。这将导致一个 300 x 500 的矩阵来保存权重。
我正在尝试解决这个问题,虽然我可以使用蛮力解决它,但是以下优化算法为我提供了一些测试用例的错误结果。我尝试了但无法找到代码的问题,任何人都可以帮助我。 问题:给定一个字符串 S 和整数 K,找到整数
我需要一个混合长度的正则表达式验证,总长度为 6 个字符,其中 4-6 个大写/数字字符和 0-2 个空格。 我试过 ^[A-Z0-9]{4,6}+[\s]{0,2}$ 但它导致最大长度为 8 个字符
我有一个数组 {-1,2,3,4,-3,-2,1,5} 现在我想找到给定数组的最小连续总和子数组,最多 K 次交换。 在上面的数组中,最小连续和是-5,子数组是{-3,-2} 对于 K=1 我应该如何
我们有一个简单的表格如下: ------------------------------------------------------------------------ | Name |
如果哈希不能超过 4 个字符,并且这 4 个字符只能是小写字母或数字,那么创建 String 哈希的最佳方法是什么? 我要散列的字符串有 1-255 个字符。我知道在没有冲突的情况下创建 4-char
我希望使用 Multipeer Connectivity 框架,并感谢任何关于如何最好地进行的经验之谈。 我需要在“教练”设备和最多 45 个“玩家”设备之间建立连接。他们都在同一个空间,但无法预测
给定一个数组 a,什么是实现其组合直到第 n 的最佳方法?例如: a = %i[a b c] n = 2 # Expected => [[], [:a], [:b], [:c], [:a, b], [
这个问题在这里已经有了答案: Formatting floats without trailing zeros (21 个回答) 关闭8年前。 我想格式化最多包含 2 个小数位的 float 列表。但
我无法使用以下形式的命令登录到远程 docker 注册表: docker login –u my-username –p my-password registry.myclient.com 我得到的错
所以这是我的代码:服务器.java import java.io.*; import java.net.*; import java.util.*; class Server implements R
我是一名优秀的程序员,十分优秀!