Amazon RDS I/O 请求 - 1 次查询 = 1 次计费 I/O?

All*_*llo 9 mysql innodb amazon-rds

我有一个 InnoDB 数据库,我想将其迁移到 Amazon RDS。

我当前的实施托管在我自己的服务器上,每月显示大约 800 万次查询。

RDS 站点说 I/O 费率为每 100 万个请求 0.10 美元

1 个 I/O = 1 个查询吗?即,对于此使用量 + RDS 费用,我是否需要支付 80 美元/月的费用?

Rol*_*DBA 7

警告:要非常小心你的数字和你认为的查询!!!

我为什么要发出这样的警告???

早在 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)
Run Code Online (Sandbox Code Playgroud)

是的,显示数据库;是一个查询。事实上,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)
Run Code Online (Sandbox Code Playgroud)

表 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)
Run Code Online (Sandbox Code Playgroud)

不,不是的。所以,显示数据库;将登陆一般日志和慢日志(启用 --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)
Run Code Online (Sandbox Code Playgroud)

只是检索 mysqld 的正常运行时间是一个查询。在内部,MySQL 如何计算正在执行的查询?这里有两个状态变量可能会有所启发:

  • 查询:服务器执行的语句数。与 Questions 变量不同,此变量包括在存储程序中执行的语句。它不计算 COM_PING 或 COM_STATISTICS 命令。

  • 问题:服务器执行的语句数。与 Queries 变量不同,这仅包括客户端发送到服务器的语句,而不包括在存储程序中执行的语句。此变量不计算 COM_PING、COM_STATISTICS、COM_STMT_PREPARE、COM_STMT_CLOSE 或 COM_STMT_RESET 命令。

请不要担心您的 MySQL 服务器是否受到监控,因为调用状态变量的监控正在内部运行查询以检索请求的数据。

10 亿在 24 天内是

  • 每天 4170 万次查询
  • 每小时 173.6 万次查询
  • 每分钟 28,935 次查询
  • 每秒 482 次查询

对于正在监控的 MySQL 实例,这些数字一点也不牵强。

如果您使用 MySQL Workbench、MySQL Administrator 或 phpMyAdmin,这些产品生成或更新的任何页面都会调用这些小的状态查询并快速运行数字。

概括

如果您的站点确实进行了 800 万次查询,那么每 100 万个请求的 I/O 费率为 0.10 美元,应该是每月 0.80 美元(80 美分)。如果您在一个月内执行 10 亿次查询,那 100.00 美元。请确保这些数字准确无误,并与坐在您旁边的 CFO 一起写下来!!!

更新 2012-05-02 16:26 EDT

由于是 8 亿次查询/月,即 80.00 美元/月


小智 6

不,一次 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 中的意思相同。