MySQLが動作するLinuxサーバーが1つあり、次のものがありました。
-12 Gb RAM
-4 x Intel(R) Xeon(R) CPU E6510 @ 1.73GHz
-CentOS release 6.3
-MySQL 5.1.61
いくつかの技術的な問題のため、サーバーの RAM メモリを 8 GB に減らす必要がありましたが、今のところ、メモリを使用できません。そして今、このため、サーバーで多くのパフォーマンスの問題が発生しています。これは、DB のサイズです。
+--------+--------------------+---------+--------+--------+------------+---------+
| tables | table_schema | rows | data | idx | total_size | idxfrac |
+--------+--------------------+---------+--------+--------+------------+---------+
| 43 | XXXXXXXX | 142.81M | 10.52G | 13.31G | 23.83G | 1.27 |
| 44 | Test_XXXXXXXX | 55.20M | 3.57G | 4.77G | 8.33G | 1.34 |
| 34 | XXXXXXXXXXXXXXXX | 23.04M | 1.39G | 1.84G | 3.24G | 1.32 |
| 23 | mysql | 0.00M | 0.00G | 0.00G | 0.00G | 0.16 |
| 28 | information_schema | NULL | 0.00G | 0.00G | 0.00G | NULL |
+--------+--------------------+---------+--------+--------+------------+---------+
これは /etc/my.cnf の内容です:
[mysqld]
max_allowed_packet = 1024M
sort_buffer_size = 512M
max_connections=500
query_cache_size = 512M
query_cache_limit = 512M
query-cache-type = 2
table_cache = 800
thread_cache_size=8
key_buffer_size = 512M
read_buffer_size=64M
read_rnd_buffer_size=64M
myisam_sort_buffer_size=64M
innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_size=7000M
innodb_additional_mem_pool_size=100M
...
サイズとRAMの関係を本当に特定できるかどうかはわかりません。しかし、状況は、12GB の RAM を使用していたときにすべてが正常に機能していたということです。「innodb_buffer_pool_size」の値は 10000M で、パフォーマンスは非常に良好でした。しかし、今では、同じ操作を 4 倍以上行う必要があります。
私たちのアプリは基本的に 1 つの DB エクスポーターであり、主に 1 つのテーブルのみにアクセスし、72,314,541 のレジスタを持っています。
+--------+---------+--------+--------+------------+---------+
| tables | rows | data | idx | total_size | idxfrac |
+--------+---------+--------+--------+------------+---------+
| 9 | 159.12M | 11.07G | 15.87G | 26.94G | 1.43 |
+--------+---------+--------+--------+------------+---------+
今のところ、「innodb_buffer_pool_size」の値を変更してテストを行っていますが、これ以上のパフォーマンスは得られないようです。問題は、MySQL のパフォーマンスを向上させるために何ができるかということです。
-Put more RAM (obviously)
-Change more variables on /etc/my.cnf?
-MySQL Partitioning for Performance
-...
すべてのアイデアと貢献を歓迎します。
前もって感謝します
編集:テーブルとクエリのすべての情報を追加しました
DB の構造は、何らかのセンサーから情報を受け取り、それを格納するためのシステムです。
測定テーブル: センサーから受け取る測定値。
+--------------------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| version | bigint(20) | NO | | NULL | |
| counter | char(2) | YES | | NULL | |
| datemeasurement_id | datetime | NO | MUL | NULL | |
| datereal_id | datetime | NO | MUL | NULL | |
| delayed | bit(1) | NO | | NULL | |
| frequency | tinyint(4) | YES | | NULL | |
| measuringentity_id | bigint(20) | NO | MUL | NULL | |
| real | bit(1) | NO | | NULL | |
| tamper | bit(1) | NO | | NULL | |
| value | float | NO | | NULL | |
+--------------------+------------+------+-----+---------+----------------+
Measuring_entity テーブル: 1 つのセンサーで複数のもの (温度、湿度) を測定できます。そして、これらはエンティティです。
+--------------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| version | bigint(20) | NO | | NULL | |
| household_id | varchar(4) | NO | MUL | NULL | |
| operative | bit(1) | NO | | NULL | |
| type | char(20) | NO | | NULL | |
| unit | char(3) | NO | | NULL | |
| interval | float | YES | | NULL | |
+--------------+------------+------+-----+---------+----------------+
sensor_measuring_entity: 1 つのセンサーに複数のエンティティを関連付けることができます。
+--------------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+------------+------+-----+---------+-------+
| sensor_id | bigint(20) | NO | PRI | NULL | |
| measuringentity_id | bigint(20) | NO | PRI | NULL | |
| version | bigint(20) | NO | | NULL | |
+--------------------+------------+------+-----+---------+-------+
センサー テーブル: 前のテーブルの測定エンティティに関連するセンサーの情報。
+---------------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+-------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| version | bigint(20) | NO | | NULL | |
| battery | bit(1) | NO | | NULL | |
| identifier | char(6) | NO | | NULL | |
| installationdate_id | datetime | NO | MUL | NULL | |
| lastreceiveddate_id | datetime | YES | MUL | NULL | |
| location_id | bigint(20) | NO | MUL | NULL | |
| operative | bit(1) | NO | | NULL | |
| tampererror | smallint(6) | NO | | NULL | |
+---------------------+-------------+------+-----+---------+----------------+
位置テーブル: センサーが配置されている場所。
+------------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| version | bigint(20) | NO | | NULL | |
| height | tinyint(4) | YES | | NULL | |
| operative | bit(1) | NO | | NULL | |
| place | char(15) | NO | MUL | NULL | |
| room | char(15) | NO | | NULL | |
| typesensor | char(15) | NO | | NULL | |
| formaster | bit(1) | YES | | NULL | |
+------------+------------+------+-----+---------+----------------+
これはクエリです(すべての家とすべてのセンサー用):
for (int z = 0; z < allHouses.length; z++) {
for (int j = 0; j < sensorlist.length; j++) {
sql.eachRow ("SELECT m.datemeasurement_id, s.identifier, me.type, m.value"
+ " FROM measurement as m"
+ " JOIN measuring_entity as me ON m.measuringentity_id = me.id"
+ " JOIN sensor_measuring_entity as sme ON sme.measuringentity_id = me.id"
+ " JOIN sensor as s ON sme.sensor_id = s.id"
+ " WHERE me.id = $actualmeid"
+ " AND me.household_id = '$mHouse'"
+ " AND m.datemeasurement_id >= '$cons_startDate'"
+ " AND m.datemeasurement_id <= '$cons_endDate'"
+ " AND m.datemeasurement_id > '$startDate'"
+ " AND m.datemeasurement_id < '$endDate'"
+ " ORDER BY datemeasurement_id")
{
}}
PD: すべてが 1 つの Grails アプリの一部です。