MySQL SELECT查询仅对运行速度非常慢的300k行执行



我对MySQL SELECT查询时间有问题。这是我的桌子:

CREATE TABLE `order_items` (
`id_order_item` bigint(20) NOT NULL,
`order_id` bigint(20) NOT NULL,
`order_item_id` bigint(20) NOT NULL,
`seller_sku` varchar(100) NOT NULL,
`shop_sku` varchar(100) NOT NULL,
`product_name` varchar(255) DEFAULT NULL,
`item_price` decimal(10,2) NOT NULL DEFAULT '0.00',
`paid_price` decimal(10,2) NOT NULL DEFAULT '0.00',
`tax_amount` decimal(10,2) NOT NULL DEFAULT '0.00',
`shipping_amount` decimal(10,2) NOT NULL DEFAULT '0.00',
`shipping_service_cost` decimal(10,2) NOT NULL DEFAULT '0.00',
`voucher_amount` decimal(10,2) NOT NULL DEFAULT '0.00',
`status` varchar(50) NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `order_items`
ADD PRIMARY KEY (`id_order_item`),
ADD KEY `seller_sku` (`seller_sku`,`shop_sku`),
ADD KEY `order_id` (`order_id`,`order_item_id`);

我在这个表上只有300k行,查询类似于:

SELECT * FROM `order_items` WHERE order_item_id=584706188389248 

耗时8-12秒。

我使用16GB RAM和8vCPU VPS。这是我的my.cnf:

symbolic-links=0
performance-schema=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
innodb_file_per_table=1
max_allowed_packet=268435456
open_files_limit=100000
max_connections = 500
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
innodb_buffer_pool_size=12G
innodb_log_file_size=512M
innodb_buffer_pool_instances=6
slow_query_log=1
long_query_time=1
log_output=FILE
slow_query_log_file=/var/lib/mysql/slow.log

有什么建议可以解决这个问题吗?谢谢你。

尝试在上仅order_item_id列上设置索引,因为这是select语句中唯一引用的列。

您当前在两个组合列order_item_idorder_id上有一个索引。

ALTER TABLE `order_items`
ADD KEY `order_item_id` (`order_item_id`);

Sitenote:您可能应该使用utf8mb4的字符集/排序规则,而不是基本的utf8,因为这实际上包含所有UTF-8字符。为什么?

最新更新