我的查询太慢了。需要一分多钟的时间。如何快速创建查询? 你能帮我吗?
select * from nss_sikdan_ok where od_id in(
select od_id from nss_order od
join nss_cart ct on od.on_uid=ct.on_uid
where ct.ct_status in('cart','sell')) and (DATE_FORMAT(today_end_date,'%Y-%m-%d')='2017-05-05') and today_end='1' limit 0,1
最佳答案
您可以采取一些措施来优化此查询。
在查询端:
避免在潜在索引列上调用函数 - 因为它不允许 MySQL 使用该列上的索引。满足以下条件:
DATE_FORMAT(today_end_date,'%Y-%m-%d')='2017-05-05'
可以修改为这一点,以避免在索引列上使用 DATE_FORMAT 函数,而只对常量值使用函数:
today_end_date >= DATE('2017-05-05') AND today_end_date < (DATE('2017-05-05') + INTERVAL 1 DAY)
====
不要在查询中使用 OFFSET 值 - 您可以使用 faster pagination with offset in MySQL 的替代方法来代替 LIMIT X,Y .
===
避免选择未使用的列 - 在大多数情况下,使用“*”运算符选择所有列会导致性能问题,因为您获取的信息比实际需要的信息多。考虑结果集中您实际需要哪些列并获取它们。
===
在适当的时候使用数字值 - 当将数字列与字符串进行比较时,您会强制 MySQL 将每行的列值从数字转换为字符串,然后才执行比较。因此,在条件today_end='1'下,如果today_end是数字列,则条件应该是:
today_end = 1
而不是:
today_end = '1'
===
此外,如果您可以提供架构结构,则可以针对这种情况推荐适当的索引。
顺便说一句,我从这个online MySQL query optimizer得到了推荐,因此请随意在其中输入您的查询和架构并获取索引建议。
关于mysql - 我的查询太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43774099/