我运行一个非常简单的MySQL数据库结构。我只拥有类似id、TimeStamp和OP_fs155e列,我认为这些列是非常基本的设置。
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太慢了,但是当我发现它在一个真正的服务器奴隶上是一样的时,它肯定有问题。
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
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
[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分钟
mysql> select TimeStamp, OP_fs155e from optical_power ORDER BY TimeStamp desc limit 15;
发布于 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,您可以查看:
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
就可以使用它而不是执行文件短。索引对于优化查询非常重要。见我的演示文稿如何设计索引,真的。sync_binlog=0
设置为允许复制日志也使用异步I/O。如果必须使用InnoDB,请对其进行优化,以获得最大的缓存和最低的持久性:
innodb_buffer_pool_size
。但不要把它弄得太大,以至于其他进程没有足够的内存。再加上10%的缓冲池,所以如果你把它设为5.12亿,那就需要5.63亿美元。关于你的评论:
我用16 so的USB USB东芝棒来代替SD卡,因为SD卡太麻烦了。
USB闪存盘(棒)在性能上与SD卡没有太大的不同。这两种设备都是针对顺序读写而不是随机读写进行优化的。它们作为文件系统或数据库工作非常糟糕。
底线是,如果您需要一个真正的服务器的性能,数据的比例属于一个服务器,那么就不要使用Raspberry Pi。
我希望用于数据收集的Raspberry Pi解决方案不会在Pi上存储任何数据,而是将数据立即发布到网络上的服务器。一个很好的解决方案是运行一个消息队列服务器,收集由您的各种Pi设备发布的事件。然后编写一个脚本来使用消息队列中的数据,并将其分批发送到数据库。
发布于 2017-01-01 19:55:01
关于你的第一个建议:
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端口,因为需要从多个传感器收集数据。我在努力
ALTER TABLE optical_power ADD INDEX(TimeStamp,OP_fs155e);
我非常感谢你的回答,我会试着玩它。
非常感谢
因此,它只是简单的时间戳和value (OP_fs155e)表。
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)
发布于 2017-01-01 22:29:47
比尔·卡温和贝恩德·布冯你好!我非常感谢你的建议!我添加了这个索引作为显示,并在演示文稿这里中解释了
mysql> ALTER TABLE optical_power ADD INDEX(TimeStamp,OP_fs155e);
的结果是3.24秒,而有时是2分钟零7分钟:惊人!
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)
https://stackoverflow.com/questions/41418232
复制相似问题