【发布时间】:2020-02-04 13:29:52
【问题描述】:
我有两个问题:
- 正如我的标题,对于大量数据运行大型查询,哪一个更有效?
我查看了 MySQL 文档,该文档在 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" taking too much time in mysql 之一的答案
按照我已执行的 cmets 中的建议
analyze <my query>
因为我的服务器是 MariaDB。
这给了我 ERROR CODE 2013: LOST connection to server during query.
我跑的时候
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
【问题讨论】:
-
请先运行
EXPLAIN <your select query here>,然后将这个解释计划的结果发布到问题中。 -
问题是“为什么我的查询很慢”,还是问题“为什么在 CMD 上比在工作台上慢?”。你似乎暗示他们都很慢......
-
@MadhurBhaiya 我已经运行了它,但是它似乎需要一段时间并给了我错误代码:2013:失去连接
-
@NevilleKuyt 我有两个问题,是的,我建议两者都需要很长时间,因此我无法衡量哪个更快,这就是我想问的。
-
@makewhite 请将连接顺序从低基数的表更改为高。然后指定
Straight_Join,这样优化器就不会改变连接顺序
标签: mysql database performance indexing