我编写了一个数据密集型网站,但 phpmyadmin 告诉我 24 天内查询次数已达 10 亿次。这似乎有点高。
我知道使用该网站的人并不多,因为虽然该网站处于上线状态,但实际上没有任何数据。从我为测试而进行的查询来看,我原本预计会有数十万个数据。
有什么问题吗?
编辑:查询数量似乎以每秒 500 次的速度增长。这对我来说很新奇,所以我不知道是否出了问题。
答案1
MySQL 将在内部调用查询。事实上,在 MySQL 中执行的几乎任何操作都是查询。
如果打开常规日志或慢查询日志,mysqld 所做的一切都会被记录下来。
如果你有不使用索引的日志查询启用后,所有不涉及索引的内容都会进入慢日志。
假设您运行以下查询:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| annarbor |
| dude |
| example |
| garbage |
| lovesh |
| mysql |
| performance_schema |
| replagdb |
| stuff |
| test |
| tostinni |
| wordpress |
| zipcodes |
+--------------------+
14 rows in set (0.06 sec)
是的,SHOW DATABASES; 是一个查询。事实上,information_schema 等价于什么???
mysql> select schema_name "Database" from information_schema.schemata;
+--------------------+
| Database |
+--------------------+
| information_schema |
| annarbor |
| dude |
| example |
| garbage |
| lovesh |
| mysql |
| performance_schema |
| replagdb |
| stuff |
| test |
| tostinni |
| wordpress |
| zipcodes |
+--------------------+
14 rows in set (0.08 sec)
表 information_schema.schemata 是否有索引?
mysql> show create table information_schema.schemata\G
*************************** 1. row ***************************
Table: SCHEMATA
Create Table: CREATE TEMPORARY TABLE `SCHEMATA` (
`CATALOG_NAME` varchar(512) NOT NULL DEFAULT '',
`SCHEMA_NAME` varchar(64) NOT NULL DEFAULT '',
`DEFAULT_CHARACTER_SET_NAME` varchar(32) NOT NULL DEFAULT '',
`DEFAULT_COLLATION_NAME` varchar(32) NOT NULL DEFAULT '',
`SQL_PATH` varchar(512) DEFAULT NULL
) ENGINE=MEMORY DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
不,不是。因此,SHOW DATABASES; 将进入一般日志和慢速日志(启用 --log-queries-not-using-indexes)
因此,许多我们认为不会构成查询的操作可能只是一个查询,但是对于 mysqld 内部而言。
如果您正在使用任何连接到 mysqld 的监控工具,这也会增加查询计数。
例子:
mysql> show global status like 'uptime'; select * from information_schema.global_status where variable_name='uptime';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Uptime | 613 |
+---------------+-------+
1 row in set (0.00 sec)
+---------------+----------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+---------------+----------------+
| UPTIME | 613 |
+---------------+----------------+
1 row in set (0.00 sec)
仅检索 mysqld 的正常运行时间就是一个查询。在内部,MySQL 如何计算正在执行的查询?以下两个状态变量可能会提供一些启示:
查询:服务器执行的语句数。与 Questions 变量不同,此变量包括在存储程序中执行的语句。它不计算 COM_PING 或 COM_STATISTICS 命令。
问题:服务器执行的语句数。与 Queries 变量不同,这仅包括客户端发送到服务器的语句,而不包括存储程序中执行的语句。此变量不计算 COM_PING、COM_STATISTICS、COM_STMT_PREPARE、COM_STMT_CLOSE 或 COM_STMT_RESET 命令。
如果您的 MySQL 服务器受到监控,请不要担心,因为调用状态变量的监控正在内部运行查询以检索请求的数据。
24 天内 10 亿是
- 每天 4170 万次查询
- 每小时 173.6 万次查询
- 每分钟 28,935 个查询
- 每秒 482 个查询
对于正在监控的 MySQL 实例来说,这些数字一点也不牵强。
如果您正在使用 MySQL Workbench、MySQL Administrator 或 phpMyAdmin,这些产品生成或更新的任何页面都会快速调用这些小状态查询并运行数字。