mysql - 优化 mysql 中具有连接和联合的查询
问题描述
我正在使用 laravel 构建我的网络应用程序。在列出所有订单时,我有一个查询,但在我的本地主机中最多需要 40 秒,而在 Goddady 共享主机中最多需要 95 秒。虽然我实现了服务器端数据表,但查询需要很长时间才能执行。我需要有人建议或帮助使查询更有效地执行。主要有两套,我做了那个联合。
select * from ((
select `subscription`.`id`,
`subscription`.`order_id`,
`users`.`name` as `user_name`,
`subscription`.`new_dated`,
`subscription`.`rescheduling_delivery_date` as expected_date,
COUNT(`subscription_items`.`product_id`) as items,
`subscription`.`od_dis_total` as `total`,
`subscription`.`order_discount`,
`area`.`area_name`,
`subscribe_orders`.`action` as ordertype,
driver.name as driver_name,
'NA' as payment_mode,
`payment_status`.`status_name` as payment_status,
`subscription_status`.`status_name` as order_status,
`subscription`.`od_payment_method`,
`subscription_items`.`product_id`,
subscription.delivered_dated
from `subscription`
left join `subscription_items` on `subscription`.`id` = `subscription_items`.`subscription_id`
left join `users` on `subscription`.`user_id` = `users`.`id`
left join `users` as `driver` on `subscription`.`driver_id` = `driver`.`id`
left join `ycias_address` on `subscription`.`add_id` = `ycias_address`.`id`
left join `area` on `ycias_address`.`area_id` = `area`.`id`
left join `subscribe_order_items` on `subscription`.`subscribe_order_id` = `subscribe_order_items`.`subscribe_order_id`
left join `subscribe_orders` on `subscription`.`subscribe_order_id` = `subscribe_orders`.`id`
left join `payment_status` on `subscription`.`payment_status` = `payment_status`.`id`
left join `subscription_status` on `subscription`.`od_status` = `subscription_status`.`id`
group by `subscription_items`.`subscription_id`)
union (
select `orders`.`id`,
`orders`.`order_id`,
`users`.`name` as `user_name`,
`orders`.`new_dated`,
`orders`.`expected_delivery_date` as expected_date,
COUNT(order_items.product_id) as items,
`orders`.`od_dis_total` as `total`,
`orders`.`order_discount`,
`area`.`area_name`,
'Instant Order' as ordertype,
driver.name as driver_name,
orders.payment_mode,
`payment_status`.`status_name` as payment_status,
`order_status`.`status_name` as order_status,
`orders`.`od_payment_method`,
`order_items`.`product_id`,
`orders`.`delivered_dated`
from `orders`
left join `order_items` on `orders`.`id` = `order_items`.`order_id`
left join `users` on `users`.`id` = `orders`.`user_id`
left join `users` as `driver` on `driver`.`id` = `orders`.`driver_id`
left join `ycias_address` on `orders`.`add_id` = `ycias_address`.`id`
left join `area` on `ycias_address`.`area_id` = `area`.`id`
left join `payment_status` on `orders`.`payment_status` = `payment_status`.`id`
left join `order_status` on `orders`.`od_status` = `order_status`.`id`
group by `order_items`.`order_id`)) as all_orders limit 10 offset 0
解决方案
根据Andy Lester给出的建议,我已经为必要的列添加了索引。因此执行时间减少到一半,即localhost 中的18 秒。我进一步调查了索引列的数据类型为VARCHAR。所以我将其更改为INT然后执行,在0.9 secs内得到结果。感谢安迪莱斯特。
推荐阅读
- javascript - 我尝试了 crypto-js 但输出不正确,请查看我的代码并纠正我的错误
- reactjs - 如何实现 ref.current 使用的测试覆盖率?
- c++ - 所有用例的双重检查锁都坏了吗?
- qt - 我想在 qml 中将一个项目向右对齐
- java - org.jdbi.v3.core.statement.UnableToCreateStatementException:查询声明无时提供了多余的命名参数
- clang-format - Clang 格式结构初始化 - 缩进两个空格?
- react-native - 如何在 SQLite 中处理“唯一约束失败”异常
- java - 在片段中创建回收站视图?
- tensorflow - 将预训练模型从 tfhub 转换为 tflite
- ionic-framework - 构建 apk [ionic 5] 后 Http 请求不起作用