Answers:
我为什么要发出这样的警告?
早在2011年8月,我在ServerFault中写了一篇文章,解释了如何在24天内执行10亿个查询。
这是整个帖子:
MySQL将在内部调用查询。实际上,您在MySQL中所做的几乎任何事情都是查询。
如果打开常规日志或慢查询日志,则mysqld所做的一切都会被记录下来。
如果启用了--log-queries-not-using-indexes,则所有不涉及索引的内容都将落入慢日志中。
假设您运行以下查询:
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)
是的,显示数据库;是一个查询。实际上,什么是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)
不,不是的。因此,显示数据库;将进入一般日志和慢日志(启用--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 Server,因为调用状态变量的监视正在内部运行查询以检索请求的数据。
24天内的10亿是
对于正在监视的MySQL实例,这些数字根本不会牵强。
如果您使用的是MySQL Workbench,MySQL Administrator或phpMyAdmin,则这些产品生成或更新的任何页面都将召唤这些小小的状态查询并快速增加编号。
如果您的站点确实进行了800万次查询,则每100万个请求的I / O费率0.10美元/月,应为0.80美元(80美分)。如果您一个月内执行10亿次查询,则$ 100.00。请绝对确保这些数字准确无误,然后与您旁边的CFO一起撰写!!!
由于它是8亿个查询/月,所以每月80.00美元
不,一个I / O操作不等于一个查询。如果一个查询由查询缓存处理(您很幸运),则可能导致0个IO操作,或者可能导致多个IO操作。我猜可能是成千上万,这取决于表,索引,查询和其他详细信息。
http://aws.amazon.com/ebs/声明以下内容:
标准卷的卷存储按您每月提供的GB量收费,直到您释放它为止。标准卷的卷I / O由您对卷发出的请求数收取。诸如IOSTAT之类的程序可随时用于测量系统的确切I / O使用率。但是,应用程序和操作系统通常执行不同级别的缓存,因此对于标准卷,除非将所有I / O同步到磁盘上,否则您的账单上I / O请求的数量可能会比应用程序看到的数量少。 。
iostat是一个低级linux实用程序,它对数据库查询一无所知。http://linux.die.net/man/1/iostat
上面的报价是针对EBS服务的,但是RDS基于EC2和EBS,因此我非常有信心它们在RDS中的含义相同。