mysql - MYSQL 查看查询性能问题
问题描述
我有 5 个 SQL 表
- 店铺
- 职员
- 部门
- 已售商品
- 员工评级
我创建了一个将这四个表连接在一起的视图。最后一张表(staff_rating),我想在接近视图行的商品售出时间(sold_items.date)的时间获取评级列。我尝试了以下 SQL 查询,它们有效但存在性能问题。
SQL 查询 1
SELECT s.name,
s.country,
d.name,
si.item,
si.date,
(SELECT rating
FROM staff_ratings
WHERE staff_id = s.id
ORDER BY DATEDIFF(date, si.date) LIMIT 1) AS rating,
st.name,
st.owner
FROM store st
LEFT OUTER JOIN staff s ON s.store_id = st.id
LFET JOIN departments d ON d.store_id = st.id
LEFT JOIN sold_items si ON si.store_id = st.id
SQL 查询 2
SELECT s.name,
s.country,
d.name,
si.item,
si.date,
si.rating ,
st.name,
st.owner
FROM store st
LEFT OUTER JOIN staff s ON s.store_id = st.id
LFET JOIN departments d ON d.store_id = st.id
LEFT JOIN (SELECT *,
(SELECT rating
FROM staff_ratings
WHERE staff_id = si.staff_id
ORDER BY DATEDIFF(date, si.date) LIMIT 1) AS rating
FROM sold_items) si ON si.store_id = st.id
SQL Query 2 比 SQL Query 1 快。但两者都存在性能问题。感谢对性能更好的查询的帮助。提前致谢。
解决方案
为什么DATEDIFF
?像这样的东西会更好吗?如果是这样,给定的索引将使其工作得更快。
WHERE staff_id = s.id
AND s.date >= s1.date
ORDER BY s.date
LIMIT 1
和INDEX(staff_id, date)
你需要LEFT JOIN
吗?也许平淡JOIN
?
d
可能会受益INDEX(store_id, name)
推荐阅读
- php - 如何使用 base64_encode 使用单引号和双引号对密码进行编码
- constraints - 流口水中的算术运算符
- .net - .Net Framework websocket 有效负载损坏
- shell - 安装包并捕获错误的 Bash 脚本
- docker - 使用 Helm2 的 Kubernetes 滚动更新
- cypress - 将多个环境的赛普拉斯结果组合为仪表板中的单次运行
- haskell - Haskell:将任何 Ast 评估为字符串
- python - SSL:TLSV1_ALERT_PROTOCOL_VERSION tlsv1 警报协议版本 (_ssl.c:661) - 跳过 - Python
- excel - Excel 中的奇怪行为与可旋转
- python - 使用 pywinauto 时有一个窗格元素而不是窗口