Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;innodb“U缓冲区”U池“U大小”;在数据库大于RAM的MySQL上_Mysql_Innodb_Ram - Fatal编程技术网

&引用;innodb“U缓冲区”U池“U大小”;在数据库大于RAM的MySQL上

&引用;innodb“U缓冲区”U池“U大小”;在数据库大于RAM的MySQL上,mysql,innodb,ram,Mysql,Innodb,Ram,我有一台使用MySQL的Linux服务器,使用: -12 Gb RAM -4 x Intel(R) Xeon(R) CPU E6510 @ 1.73GHz -CentOS release 6.3 -MySQL 5.1.61 由于一些技术问题,我们不得不将服务器的RAM内存减少到8GB,目前我们无法拥有任何内存。现在,由于这个原因,我们的服务器上出现了很多性能问题。这是我们数据库的大小: +--------+--------------------+---------+--------+--

我有一台使用MySQL的Linux服务器,使用:

-12 Gb RAM 
-4 x Intel(R) Xeon(R) CPU E6510  @ 1.73GHz
-CentOS release 6.3
-MySQL 5.1.61
由于一些技术问题,我们不得不将服务器的RAM内存减少到8GB,目前我们无法拥有任何内存。现在,由于这个原因,我们的服务器上出现了很多性能问题。这是我们数据库的大小:

+--------+--------------------+---------+--------+--------+------------+---------+
| 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内存时,一切都正常工作。“innodb_buffer_pool_size”值为10000M,性能非常好。但是现在,做同样的操作需要4倍以上的时间

我们的应用程序基本上是一个DB导出器,只访问一个表,它有72314541个寄存器

+--------+---------+--------+--------+------------+---------+
| tables | rows    | data   | idx    | total_size | idxfrac |
+--------+---------+--------+--------+------------+---------+
|      9 | 159.12M | 11.07G | 15.87G | 26.94G     |    1.43 |
+--------+---------+--------+--------+------------+---------+
目前,我们正在测试更改“innodb\u buffer\u pool\u size”的值,但看起来我们不会获得更多的性能。现在的问题是,我们可以做些什么来提高MySQL的性能

-Put more RAM (obviously)
-Change more variables on /etc/my.cnf?
-MySQL Partitioning for Performance
-...
欢迎所有的想法和贡献

提前谢谢

编辑:添加表和查询的所有信息

数据库的结构是从一些传感器接收信息并存储信息的系统

测量表:我们从传感器接收到的测量值

+--------------------+------------+------+-----+---------+----------------+
| 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    |                |
+--------------------+------------+------+-----+---------+----------------+
测量实体表:一个传感器可以测量多个物体(温度、湿度)。这些是实体

+--------------+------------+------+-----+---------+----------------+
| 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    |                |
+--------------+------------+------+-----+---------+----------------+
传感器测量实体:一个传感器可以关联多个实体

+--------------------+------------+------+-----+---------+-------+
| 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='$cons_startDate'”
+“和m.datemeasurement_id'$startDate'”
+“和m.datemeasurement_id<'endDate'”
+“按日期计量的订单”
{
}}

PD:所有东西都是Grails应用程序的一部分。

您分配了太多的RAM并开始进行交换。交换比缩小设置更糟糕

对于8GB,建议您进行以下更改

innodb_缓冲区_池_大小=5000M 查询缓存大小=50M


如果你说你使用的是MyISAM还是InnoDB,我会给你更多提示。

InnoDB会希望使用缓冲池中的表,但由于它不能满足所有要求,可能需要根据查询的不同,在每次查询时都点击磁盘。你需要使用InnoDB吗?MyISAM可能更好,这取决于你的应用程序使用的是e数据库。您可以通过优化数据类型和索引使用来减少表和索引的大小。如果您发布表结构,我可能会指出一些优化。首先,感谢@G-Nugget的回复。我在主要问题中添加了有关查询和表结构的更多信息。表是InnoDB因为每天都在节省大量的测量数据。根据您原始帖子中的数字判断,所有的
BIGINT
s可能是
INT
s或更小,比如
location\u id
。在
location
中,
CHAR
s可能是
VARCHAR
s,但这可能不会造成错误总的来说,iceable差异不大。如果在编程方面不太难更改,
DATETIME
字段可以是
TIMESTAMP
s,这样每更改一列可以节省2个字节/行。将
BIGINT
s更改为
INT
s每更改一列可以节省4个字节/行,这将是
sensor\u实体大小的一半
。如果可以的话,复制一份表格并尝试这些更改。恐怕只晚了2年才回答:)是的,但它会从未回答的问题中解决。
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")
{
}}