mysql - 如何让mysql查询更快
问题描述
由@RolandStarke 先生解决
将日期(t4. date
)更改为 t4。date
它将使用索引
查询耗时 0.5519 秒。
我试图让这个查询更快我试过这个
第一个查询# 没有连接
SELECT `productTitle`,`orderCnt`,`promPCPriceStr`,`productImgUrl`,`oriPriceStr`,`detailUrl`,
(
select count(id) from orders t4 WHERE
t4.productId = t1.productId
and DATE( t4.`date`) > DATE_SUB(CURDATE(), INTERVAL 2 DAY)
) as ordertoday
FROM `products` t1
WHERE `orderCnt` > 0
AND `orderCnt` < 2000
AND `promPCPriceStr` > 0
AND `promPCPriceStr` < 2000
HAVING ordertoday > 5 AND ordertoday < 2000
order by ordertoday desc limit 150
结果是
查询耗时 4.0222 秒。
解释结果
第二个查询# with join
SELECT `productTitle`,`orderCnt`,`promPCPriceStr`,`productImgUrl`,`oriPriceStr`,`detailUrl` FROM `products` p
INNER JOIN
(
select count(id) AS filterd_orders,productId from orders t4 WHERE DATE( t4.`date`) > DATE_SUB(CURDATE(), INTERVAL 2 DAY)
GROUP by productId
) o
ON p.productID = o.productId
AND `orderCnt` > 0 AND `orderCnt` < 2000 AND `promPCPriceStr` > 0 AND `promPCPriceStr` < 2000
and filterd_orders > 5
AND filterd_orders < 2000
order by filterd_orders desc limit 30
查询耗时 4.8217 秒。
解释结果
子查询结果
select count(id) AS filterd_orders,productId from orders t4 WHERE DATE( t4.`date`) > DATE_SUB(CURDATE(), INTERVAL 3 DAY) GROUP by productId
查询耗时 0.0044 秒。
解释结果
表结构
产品表
CREATE TABLE `products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`productId` bigint(20) NOT NULL,
`detailUrl` text CHARACTER SET utf32 NOT NULL,
`belongToDSStore` int(11) NOT NULL,
`promPCPriceStr` float NOT NULL DEFAULT '-1',
`oriPriceStr` float NOT NULL DEFAULT '-1',
`orderCnt` int(11) NOT NULL,
`productTitle` text CHARACTER SET utf32 NOT NULL,
`productImgUrl` text CHARACTER SET utf32 NOT NULL,
`created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`cat` bigint(20) NOT NULL DEFAULT '-1',
PRIMARY KEY (`id`),
UNIQUE KEY `productId` (`productId`),
KEY `orderCnt` (`orderCnt`),
KEY `cat` (`cat`),
KEY `promPCPriceStr` (`promPCPriceStr`)
) ENGINE=InnoDB AUTO_INCREMENT=37773 DEFAULT CHARSET=latin1
订单表
CREATE TABLE `orders` (
`oid` int(11) NOT NULL AUTO_INCREMENT,
`countryCode` varchar(10) NOT NULL,
`date` datetime NOT NULL,
`id` bigint(20) NOT NULL,
`productId` bigint(20) NOT NULL,
PRIMARY KEY (`oid`),
UNIQUE KEY `id` (`id`),
KEY `date` (`date`),
KEY `productId` (`productId`)
) ENGINE=InnoDB AUTO_INCREMENT=9790205 DEFAULT CHARSET=latin1
还
innodb_buffer_pool_size = {DBInstanceClassMemory*3/4}
服务器硬件
- AWS RDS db.t2.medium
- 4 GB 内存
- 2 个 CPU 核心 2.5Hz
解决方案
推荐阅读
- python - 使用Python以相同的顺序获取具有元素的列表的所有子列表
- snowflake-cloud-data-platform - Snowflake - 使用 $ 访问区分大小写的变量
- prolog - 尝试在序言中打印简单数字时出现意外错误
- mysql - 自动化 MySQL 从开发到登台的迁移
- r - Geom_bar_pattern 不将 x 轴类别视为不同
- java - 以角度嵌入 vimeos 视频
- verilog - 将二维实数组传递给 System Verilog 中的函数
- sql - 如何根据 SQL 中包含的列值的条件创建列?
- firebase - 用 JS 以外的语言编写 Firebase 函数
- java - 为什么在方法中使用后赋值?