我有两个问题:
- 正如我的标题,哪一个对于对大量数据运行大型查询更有效?
我查看了 MySQL 文档,其中解释了工作台的性能https://www.mysql.com/products/workbench/performance/ https://www.mysql.com/products/workbench/performance/但是我似乎找不到任何资源专门讨论在 cmd 上运行查询和在工作台上运行查询之间的效率差异。
-
如何优化这个查询
select
r.user_id,
k.id as kickscooter_id,
st_astext(k.location) as location,
k.created_at,
k.serial_number,
k_st.serial_number as states_serial_number,
st_astext(k_st.gps) as gps_location,
k_st.gps_updated_at,
r.start_time,
r.end_time
from kickscooters k
join rents r
on k.id= r.kickscooter_id
join kickscooter_states_190614 k_st
on k.serial_number = k_st.serial_number
order by r.rent_date
limit 999;
我了解到创建索引可以让 mysql 快速排序,因此我添加了索引
ALTER TABLE `tablename` ADD INDEX `indexname` (`columnname`);
以下是 SO 帖子之一的答案“order by”在mysql中花费太多时间 https://stackoverflow.com/questions/1130772/order-by-taking-too-much-time-in-mysql
正如我已执行的评论中所建议的
analyze <my query>
因为我的服务器是 MariaDB。
这给了我错误代码 2013:查询期间丢失与服务器的连接。
当我跑的时候
explain <my query>
它起作用并输出:
id select_type table type possible_keys
1 SIMPLE k_st ALL kickscooter_states_190614_serial_number_date_index
1 SIMPLE k ref PRIMARY,kickscooters_serial_number_unique,kickscooters_serial_number_index
1 SIMPLE r ref rents_kickscooter_id_foreign
-table continued
/ key key_len ref rows extra
null null null 192818947 Using temporary; Using filesort
kickscooters_serial_number_unique 27 kickgoing_db.k_st.serial_number 1
rents_kickscooter_id_foreign 4 kickgoing_db.k.id 143
根据解释计划,优化器无法使用任何索引ORDER BY rent
。所以请尝试以下操作:
- 确保索引存在
rent_date
的栏目rents
桌子。该索引将用于优化ORDER BY
条款。可以是单列索引,也可以是多列索引(用于其他场景)。但是,如果是多列,您需要确保rent
列是索引顺序中的第一列。
- 确保索引存在
id
的栏目kickscooters
桌子。有关单列/多列索引的详细信息与第 1 点中的相同。
- 确保索引存在
serial_number
的栏目kickscooter_states_190614
桌子。有关单列/多列索引的详细信息与第 1 点中的相同。
现在,在确保这些索引之后,尝试原始查询。最有可能的是,优化器应该能够优化连接顺序。此外,在上面的查询中,您可以使用以下命令强制连接顺序STRAIGHT_JOIN https://stackoverflow.com/a/516720/2469308优化器提示。因此,也尝试以下查询,并在两者之间进行基准测试:
select
r.user_id,
k.id as kickscooter_id,
st_astext(k.location) as location,
k.created_at,
k.serial_number,
k_st.serial_number as states_serial_number,
st_astext(k_st.gps) as gps_location,
k_st.gps_updated_at,
r.start_time,
r.end_time
from kickscooters k
straight_join rents r
on k.id= r.kickscooter_id
straight_join kickscooter_states_190614 k_st
on k.serial_number = k_st.serial_number
order by r.rent_date
limit 999;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)