我刚买了一个Asustor来处理我的视频、图片、音乐等等。家里有一个桌面和笔记本电脑,我觉得在NAS上安装我的数据库是个好主意(它已经预装好了MariaDB )。
设置: RAID 1,最大读取规格约110 Mbps /s从磁盘,连接通过1.3Mbps WiFi与千兆位连接。使用BlackMagic基准测试获得大约60/s。
查询:
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次):
`orders` - 1.7k rows, 11 columns
`items` - 4.8k rows, 12 columns
`customers` - 1.7k rows, 9 columns我的问题是:
非常感谢。
**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;`发布于 2018-09-22 03:54:31
是的,这是很糟糕的表现。查询的正确索引将在一定程度上解决查询的性能问题。要让NAS使用innodb_buffer_pool和空闲内存作为磁盘缓存是很困难的,因为机上只有512米。
通过帮助连接和排序,纠正表的索引。设计更改以使用整数主键进行联接。作为第一步,如果order_id真的不是utf8,并且只是对该列的latin1进行更改,从而使键更小,那么也可以将其更改为主键。
因为这是查询中的整个两个表数据搜索,所以如果所有的表都能留在RAM中,它只会消除IO延迟。
托管数据库将提供更多的RAM,并可能提供更快的CPU。
发布于 2021-09-10 03:04:42
我的NAS版本是Mariadb 10.3.29,为我吹换工作,你可以试试!
/volume1/@appstore/MariaDB10/usr/local/mariadb10/etc/mysql/my.cnf-或
SET GLOBAL innodb_flush_log_at_trx_commit=0;https://stackoverflow.com/questions/52451930
复制相似问题