刚给自己买了一个asustor nas来处理我的视频、图片、音乐等。家里有一个台式机和一个笔记本,我想在nas上设置我的数据库是个好主意(已经预装了mariadb)。
设置:raid1,磁盘最大读取速度约110mb/s,通过1.3mbps的wifi连接,千兆连接。使用blackmagic基准测试获得大约60mb/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;
table orders
表中有大约180万行 items
大约有4700行。查询影响5k行,运行时间在4.8到7.0秒之间,对于这样一个简单的查询来说,这似乎很荒谬。我曾经在本地主机上运行相同的查询(好的,这是一个nvmesd,我得到的要快得多),以毫秒为单位。 order_id
是一个包含大约10个字符的varchar。
在所有表中插入所有数据大约需要7(上次是9)分钟:
`orders` - 1.7k rows, 11 columns
`items` - 4.8k rows, 12 columns
`customers` - 1.7k rows, 9 columns
我的问题是:
这真的是一个糟糕的性能,还是我得到了错误的性能基准后,使用了NVMESSD的?
如果它确实不好,我可以做些什么来改进它(仍然在我的nas上托管我的db)?
在联机托管数据库上,我能期望什么样的性能?
谢谢。
**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;`
1条答案
按热度按时间w8rqjzmb1#
这真的是一个糟糕的性能,还是我得到了错误的性能基准后,使用了NVMESSD的?
是的,这是一种糟糕的表现。正确的查询索引将在一定程度上解决查询的性能问题。要让nas使用innodb\u buffer\u pool和空闲内存作为磁盘缓存将非常困难,因为只有512m在板上。
如果它确实不好,我可以做些什么来改进它(仍然在我的nas上托管我的db)?
使用联接和顺序来更正表的索引。设计更改为对联接使用整数主键。作为第一步,如果
order_id
实际上不是utf8,只是拉丁文1对该列进行了更改,这样可以使键变小,也可以将其更改为主键。由于这是一个完整的查询中的两个表的数据搜索,它只能消除io延迟,如果它都可以留在ram。
在联机托管数据库上,我能期望什么样的性能?
托管数据库将提供更多的ram,可能还有更快的cpu。