首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NAS上非常慢的MySQL性能

NAS上非常慢的MySQL性能
EN

Stack Overflow用户
提问于 2018-09-21 22:55:26
回答 2查看 1.4K关注 0票数 0

我刚买了一个Asustor来处理我的视频、图片、音乐等等。家里有一个桌面和笔记本电脑,我觉得在NAS上安装我的数据库是个好主意(它已经预装好了MariaDB )。

设置: RAID 1,最大读取规格约110 Mbps /s从磁盘,连接通过1.3Mbps WiFi与千兆位连接。使用BlackMagic基准测试获得大约60/s。

查询:

代码语言:javascript
复制
    SELECT items.title, items.discount, items.qtd, items.price,  ((price * qtd) - discount) AS total, DATE_FORMAT(orders.created_at, '%m-%y')
    FROM items
    INNER JOIN orders ON orders.order_id = items.order_id
    ORDER BY created_at;

orders大约有1.8k行,表items大约有4.7k行。查询影响5k行,运行时间在4.8到7.0秒之间,对于这样简单的查询来说,这似乎是荒谬的。我过去常常在本地主机上运行相同的查询(好的,这是一个NVMe SSD,我得到的查询要快得多),时间是毫秒。order_id是一个包含大约10个字符的VARCHAR。

在所有表格中插入所有数据花费了大约7分钟(上次9次):

代码语言:javascript
复制
`orders` - 1.7k rows, 11 columns
`items` - 4.8k rows, 12 columns
`customers` - 1.7k rows, 9 columns

我的问题是:

  1. 性能真的有那么差吗?还是我在使用NVMe SSD之后得到了错误的性能基准?
  2. 如果它确实是坏的,我能做些什么来改进它(仍然在我的NAS上托管我的DB )?
  3. 在一个在线托管的数据库上,我能期望性能上的提升吗?

非常感谢。

代码语言:javascript
复制
**Tables:**
`CREATE TABLE `orders` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `order_id` varchar(15) DEFAULT NULL COMMENT 'VA',
  `created_at` datetime DEFAULT NULL,
  `gateway` varchar(25) DEFAULT NULL,
  `total` decimal(15,0) DEFAULT NULL,
  `subtotal` decimal(15,0) DEFAULT NULL,
  `status` varchar(20) DEFAULT NULL,
  `discounts` decimal(15,0) DEFAULT NULL,
  `total_price` decimal(15,0) DEFAULT NULL,
  `order_number` varchar(15) DEFAULT NULL,
  `processing` varchar(15) DEFAULT NULL,
  `customer_id` varchar(15) DEFAULT NULL,
  `number` varchar(15) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `number` (`number`),
  UNIQUE KEY `order_id` (`order_id`),
  KEY `customer_id` (`customer_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1712 DEFAULT CHARSET=utf8;`
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-22 03:54:31

  1. 性能真的有那么差吗?还是我在使用NVMe SSD之后得到了错误的性能基准?

是的,这是很糟糕的表现。查询的正确索引将在一定程度上解决查询的性能问题。要让NAS使用innodb_buffer_pool和空闲内存作为磁盘缓存是很困难的,因为机上只有512米。

  1. 如果它确实是坏的,我能做些什么来改进它(仍然在我的NAS上托管我的DB )?

通过帮助连接和排序,纠正表的索引。设计更改以使用整数主键进行联接。作为第一步,如果order_id真的不是utf8,并且只是对该列的latin1进行更改,从而使键更小,那么也可以将其更改为主键。

因为这是查询中的整个两个表数据搜索,所以如果所有的表都能留在RAM中,它只会消除IO延迟。

  1. 在一个在线托管的数据库上,我能期望性能上的提升吗?

托管数据库将提供更多的RAM,并可能提供更快的CPU。

票数 1
EN

Stack Overflow用户

发布于 2021-09-10 03:04:42

我的NAS版本是Mariadb 10.3.29,为我吹换工作,你可以试试!

  • /volume1/@appstore/MariaDB10/usr/local/mariadb10/etc/mysql/my.cnf
  • 更改#innodb_flush_log_at_trx_commit =1 到innodb_flush_log_at_trx_commit =0
  • 重启MySQL

-或

  • 登录MySQL
  • SET GLOBAL innodb_flush_log_at_trx_commit=0;
  • 您可以在运行时更改它并检查不同的内容!
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52451930

复制
相关文章

相似问题

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