我在Mysql中运行了一个查询,如下所示:
EXPLAIN
SELECT *
FROM(
SELECT * # Select Number 2
FROM post
WHERE parentid = 13
ORDER BY time, id
LIMIT 1, 10
) post13_childs
JOIN post post13_childs_childs
ON post13_childs_childs.parentid = post13_childs.id
Run Code Online (Sandbox Code Playgroud)
结果是:
id |select_type |table |type |possible_keys |key |key_len |ref |rows |Extra
1 |PRIMARY |<derived2> |ALL | NULL | NULL |NULL |NULL |10 |
1 |PRIMARY |post13_childs_childs|ref |parentid |parentid |9 |post13_childs.id |10 |Using where
2 |DERIVED |post |ALL |parentid |parentid |9 | |153153 |Using where; Using filesort
Run Code Online (Sandbox Code Playgroud)
这意味着它使用了索引, …
MySQL问题是StackOverflow上我最喜欢的一些问题.
不幸的是,这样的事情:
SELECT foo, bar, baz, quux, frozzle, lambchops FROM something JOIN somethingelse ON 1=1 JOIN (SELECT * FROM areyouserious) v ON 0=5 WHERE lambchops = 'good';
Run Code Online (Sandbox Code Playgroud)
让我的眼睛流血.
此外,尝试描述您的架构通常如下所示:
我有一个表CrazyTable,其中一个列是一个日期,它有一个主键Foo_Key但我想使用column_bar的子串(在CrazyTable中)加入SOMETABLE,该子串与月亮的相位有关(我存储了它)在moon_phases中作为三次序列化的PHP数组).
这是我问的一个问题的例子,如果我没有按照下面的步骤操作,我将永远不会得到任何人的满意答复:我没有羞耻..
我将在下面回答最能帮助我解决问题的方法.什么帮助你?
假设您有这样的查询......
SELECT T.TaskID, T.TaskName, TAU.AssignedUsers
FROM `tasks` T
LEFT OUTER JOIN (
SELECT TaskID, GROUP_CONCAT(U.FirstName, ' ',
U.LastName SEPARATOR ', ') AS AssignedUsers
FROM `tasks_assigned_users` TAU
INNER JOIN `users` U ON (TAU.UserID=U.UserID)
GROUP BY TaskID
) TAU ON (T.TaskID=TAU.TaskID)
Run Code Online (Sandbox Code Playgroud)
可以将多个人分配给给定任务.此查询的目的是为每个任务显示一行,但将人员分配给单个列中的任务
现在...假设你有正确的指标设置上tasks,users和tasks_assigned_users.在连接tasks到派生表时,MySQL Optimizer仍然不会使用TaskID索引.WTF?!?!?
所以,我的问题是......如何使这个查询使用tasks_assigned_users.TaskID上的索引?临时表是蹩脚的,所以如果这是唯一的解决方案...... MySQL优化器是愚蠢的.
使用的索引:
编辑:此外,此页面表示派生表在连接发生之前执行/实现.为什么不重新使用密钥来执行连接?
编辑2: MySQL优化器不会让你在派生表上放置索引提示(大概是因为派生表上没有索引)
编辑3:这是一篇非常好的博客文章:http: …
我正在尝试优化我的MySQL查询,我需要一些帮助.这是我目前的查询:
SELECT *,
(SELECT name FROM stores WHERE id = products.store_id) AS store_name,
(SELECT username FROM stores WHERE id = products.store_id) AS store_username,
(SELECT region_id FROM stores WHERE id = products.store_id) AS region_id,
(SELECT city_id FROM stores WHERE id = products.store_id) AS city_id,
(SELECT name FROM categories_sub WHERE id = products.subcategory_id) AS subcategory_name,
(SELECT name FROM categories WHERE id = category_id) AS category_name
FROM products
WHERE date_start <= DATE(NOW()) AND date_end >= DATE(NOW())
Run Code Online (Sandbox Code Playgroud)
我很确定它可以更快.
我也有一个问题,当我尝试按region_id选择所有产品时(通过添加类似"AND region_id = MYID"的东西)它不起作用,我想知道它是否可以让它工作,以及如何?
感谢您的时间!
解 …