首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Centos 7中的MySQL性能差

Centos 7中的MySQL性能差
EN

Stack Overflow用户
提问于 2017-01-01 19:15:39
回答 3查看 2.1K关注 0票数 0

我运行一个非常简单的MySQL数据库结构。我只拥有类似id、TimeStamp和OP_fs155e列,我认为这些列是非常基本的设置。

代码语言:javascript
运行
复制
MariaDB [gadbdfm]> desc optical_power;
+-----------+------------------+------+-----+----------------------+-----------------------------+
| Field     | Type             | Null | Key | Default              | Extra                       |
+-----------+------------------+------+-----+----------------------+-----------------------------+
| id_record | int(10) unsigned | NO   | PRI | NULL                 | auto_increment              |
| TimeStamp | timestamp(6)     | NO   |     | CURRENT_TIMESTAMP(6) | on update CURRENT_TIMESTAMP |
| OP_fs155e | varchar(30)      | YES  | MUL | NULL                 |                             |
| data1     | varchar(30)      | YES  |     | NULL                 |                             |
| data2     | varchar(30)      | YES  |     | NULL                 |                             |
| data3     | varchar(30)      | YES  |     | NULL                 |                             |
| data4     | varchar(30)      | YES  |     | NULL                 |                             |
| data5     | varchar(30)      | YES  |     | NULL                 |                             |
+-----------+------------------+------+-----+----------------------+-----------------------------+
8 rows in set (0.00 sec)

然而,我开始注意到,我的选择首先在Raspberry Pi 3(作为主服务器)和Centos7 (作为从- 8GB的肌肉服务器)上非常慢。这是我在从服务器上选择的所有东西,花费了几分钟。我认为问题是Raspberry Pi 3太慢了,但是当我发现它在一个真正的服务器奴隶上是一样的时,它肯定有问题。

代码语言:javascript
运行
复制
MariaDB [gadbdfm]> select TimeStamp,OP_fs155e from optical_power;

| 2017-01-01 17:41:03.697000 | -24       |
| 2017-01-01 17:42:03.666000 | -24       |
| 2017-01-01 17:43:03.701000 | -24       |
| 2017-01-01 17:44:03.675000 | -24       |
| 2017-01-01 17:45:03.676000 | -24       |
| 2017-01-01 17:46:03.692000 | -24       |
| 2017-01-01 17:47:03.686000 | -24       |
| 2017-01-01 17:48:03.539000 | -24       |
| 2017-01-01 17:49:03.581000 | -24       |
+----------------------------+-----------+
23044062 rows in set (37.24 sec)

硕士my.cnf

代码语言:javascript
运行
复制
pi@rpi3jantoth - /opt/FlightStrata155E cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "#" | grep -v "^$"
[mysqld_safe]
socket      = /var/run/mysqld/mysqld.sock
nice        = 0
[mysqld]
user        = mysql
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
port        = 3306
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address        = 0.0.0.0
key_buffer_size     = 16M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8
myisam-recover         = BACKUP
query_cache_limit   = 1M
query_cache_size        = 16M
log_error = /var/log/mysql/error.log
server-id       = 1
log_bin         = /var/log/mysql/mysql-bin.log
expire_logs_days    = 10
max_binlog_size   = 100M
relay-log = /var/lib/mysql/mysql-relay-bin
relay-log-index = /var/lib/mysql/mysql-relay-bin.index
log-error = /var/lib/mysql/mysql.err

从my.cnf

代码语言:javascript
运行
复制
[root@fiber ~]# cat /etc/my.cnf | grep -v "#" | grep -v "^$"
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
server-id = 2
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d

我知道我的方案中有零优化

还有一个例子:

这个选择在树莓Pi 3上需要大约7分钟

代码语言:javascript
运行
复制
mysql> select TimeStamp, OP_fs155e from optical_power ORDER BY TimeStamp desc limit 15;
EN

回答 3

Stack Overflow用户

发布于 2017-01-01 20:10:19

Raspberry Pi使用SD卡进行存储,因此I/O性能将比真正的服务器磁盘系统差得多是可以理解的。

您的第一个查询需要37.24秒才能返回2300万行。这是相当多的I/O。我估计您可以适应每16 23页大约500行(假设数据列平均为3字节),所以您需要读取超过46,000页才能读取2300万行,这将达到755 23。

我敢打赌,这或多或少是您的表的data_length,您可以查看:

代码语言:javascript
运行
复制
SHOW TABLE STATUS LIKE 'optical_power'\G

但是SD卡上随机读取的I/O速率在2.28MB/秒到8.10MB/秒之间,因此从SD卡读取755 to需要93到331秒。那只是数学。

也许有些数据页已经缓存在MySQL的缓冲池中,或者InnoDB能够在这里进行一些预读优化以提供帮助。

您的第二个查询没有得到很好的优化。它必须使用文件短,因为您的TimeStamp列上没有索引。文件可以使用临时存储空间,这会导致写入I/O。写入比在SD卡上读取要慢得多。因此,执行ORDER BY TimeStamp LIMIT 15查询只需7分钟就不足为奇了。

很明显,SD卡的品牌带来了很大的不同。有关一些比较,请参见http://www.jeffgeerling.com/blogs/jeff-geerling/raspberry-pi-microsd-card

但是,即使你得到一个SD卡更快,你仍然是造成磨损,使用低效率的I/O。最好避免I/O。

  • 在您的TimeStamp列上创建一个索引,这样ORDER BY TimeStamp就可以使用它而不是执行文件短。索引对于优化查询非常重要。见我的演示文稿如何设计索引,真的
  • 许多Raspberry用户将MySQL数据存储在MyISAM存储引擎中。MyISAM只使用缓冲的I/O,没有崩溃安全特性。这将有助于改善I/O性能和减少磨损在您的SD卡。索引和复制可以很好地处理MyISAM表。MyISAM还倾向于将数据存储在比InnoDB小的空间中。
  • 请确保将sync_binlog=0设置为允许复制日志也使用异步I/O。

如果必须使用InnoDB,请对其进行优化,以获得最大的缓存和最低的持久性:

  • 尽可能多地增加innodb_buffer_pool_size。但不要把它弄得太大,以至于其他进程没有足够的内存。再加上10%的缓冲池,所以如果你把它设为5.12亿,那就需要5.63亿美元。
  • 避免同步I/O,并尽可能使用缓冲I/O。请参阅https://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-diskio.html innodb_flush_log_at_trx_commit=2 innodb_flush_method=O_DSYNC innodb_doublewrite=0

关于你的评论:

我用16 so的USB USB东芝棒来代替SD卡,因为SD卡太麻烦了。

USB闪存盘(棒)在性能上与SD卡没有太大的不同。这两种设备都是针对顺序读写而不是随机读写进行优化的。它们作为文件系统或数据库工作非常糟糕。

底线是,如果您需要一个真正的服务器的性能,数据的比例属于一个服务器,那么就不要使用Raspberry Pi。

我希望用于数据收集的Raspberry Pi解决方案不会在Pi上存储任何数据,而是将数据立即发布到网络上的服务器。一个很好的解决方案是运行一个消息队列服务器,收集由您的各种Pi设备发布的事件。然后编写一个脚本来使用消息队列中的数据,并将其分批发送到数据库。

票数 1
EN

Stack Overflow用户

发布于 2017-01-01 19:55:01

关于你的第一个建议:

代码语言:javascript
运行
复制
Database changed
mysql> SHOW TABLE STATUS LIKE 'optical_power'\G
*************************** 1. row ***************************
           Name: optical_power
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 22030014
 Avg_row_length: 38
    Data_length: 843055104
Max_data_length: 0
   Index_length: 0
      Data_free: 7340032
 Auto_increment: 34973978
    Create_time: 2016-12-30 16:10:49
    Update_time: NULL
     Check_time: NULL
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)

我使用16 to的USB东芝棒作为存储,而不是使用SD卡,因为我在SD cards.For实例上有很多问题,所以我使用了所有的覆盆子pi3 USB端口,因为需要从多个传感器收集数据。我在努力

代码语言:javascript
运行
复制
ALTER TABLE optical_power ADD INDEX(TimeStamp,OP_fs155e);

我非常感谢你的回答,我会试着玩它。

非常感谢

因此,它只是简单的时间戳value (OP_fs155e)表。

代码语言:javascript
运行
复制
code mysql> select TimeStamp, OP_fs155e from optical_power ORDER BY TimeStamp desc limit 15;
+----------------------------+-----------+
| TimeStamp                  | OP_fs155e |
+----------------------------+-----------+
| 2017-01-01 17:49:03.581000 | -24       |
| 2017-01-01 17:48:03.539000 | -24       |
| 2017-01-01 17:47:03.686000 | -24       |
| 2017-01-01 17:46:03.692000 | -24       |
| 2017-01-01 17:45:03.676000 | -24       |
| 2017-01-01 17:44:03.675000 | -24       |
| 2017-01-01 17:43:03.701000 | -24       |
| 2017-01-01 17:42:03.666000 | -24       |
| 2017-01-01 17:41:03.697000 | -24       |
| 2017-01-01 17:40:03.688000 | -24       |
| 2017-01-01 17:39:03.574000 | -24       |
| 2017-01-01 17:38:03.596000 | -24       |
| 2017-01-01 17:37:03.545000 | -24       |
| 2017-01-01 17:36:03.667000 | -24       |
| 2017-01-01 17:35:03.544000 | -24       |
+----------------------------+-----------+
15 rows in set (2 min 41.32 sec)
票数 0
EN

Stack Overflow用户

发布于 2017-01-01 22:29:47

比尔·卡温和贝恩德·布冯你好!我非常感谢你的建议!我添加了这个索引作为显示,并在演示文稿这里中解释了

代码语言:javascript
运行
复制
mysql> ALTER TABLE optical_power ADD INDEX(TimeStamp,OP_fs155e);

的结果是3.24秒,而有时是2分钟零7分钟:惊人!

代码语言:javascript
运行
复制
   mysql> use gadbdfm;
Database changed
mysql> select TimeStamp, OP_fs155e from optical_power ORDER BY TimeStamp desc limit 15;
+----------------------------+-----------+
| TimeStamp                  | OP_fs155e |
+----------------------------+-----------+
| 2017-01-01 17:49:03.581000 | -24       |
| 2017-01-01 17:48:03.539000 | -24       |
| 2017-01-01 17:47:03.686000 | -24       |
| 2017-01-01 17:46:03.692000 | -24       |
| 2017-01-01 17:45:03.676000 | -24       |
| 2017-01-01 17:44:03.675000 | -24       |
| 2017-01-01 17:43:03.701000 | -24       |
| 2017-01-01 17:42:03.666000 | -24       |
| 2017-01-01 17:41:03.697000 | -24       |
| 2017-01-01 17:40:03.688000 | -24       |
| 2017-01-01 17:39:03.574000 | -24       |
| 2017-01-01 17:38:03.596000 | -24       |
| 2017-01-01 17:37:03.545000 | -24       |
| 2017-01-01 17:36:03.667000 | -24       |
| 2017-01-01 17:35:03.544000 | -24       |
+----------------------------+-----------+
15 rows in set (3.24 sec)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41418232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档