在我的mysql数据库中,我具有Orderhead和Orderline表以及其他表。订单头包含37700,订单行包含965093行。 我查询订单的查询如下
SELECT * FROM Orderline
INNER JOIN
(
SELECT UUID FROM Orderhead WHERE 1 AND Orderhead.InsertTime >= '0001-01-01 00:00:00' AND Employee = 'TK' AND TYPE NOT IN ('WebShop')
) AS `Orderhead` ON `Orderline`.`OrderUUID` = `Orderhead`.`UUID` ORDER BY Orderline.Number
查询返回19962行。但是很奇怪,它从应用程序中抛出错误“查询期间与MySQL服务器的连接丢失”。在查询窗口(SQLyog) 当我有时需要45秒,5秒(尽管我尝试了SQL_NO_CACHE,RESET QUERY CACHE,FLUSH QUERY CACHE而不考虑缓存)运行查询时。 我不确定使用IN或EXISTS关键字能获得多少性能优势。
In---
SELECT * FROM Orderline
WHERE `Orderline`.`OrderUUID` IN
(
SELECT UUID FROM Orderhead WHERE 1 AND Orderhead.InsertTime >= '0001-01-01 00:00:00' AND Employee = 'TK' AND TYPE NOT IN ('WebShop')
) ORDER BY Orderline.Number
Exists---
SELECT * FROM Orderline
WHERE EXISTS
(
SELECT UUID FROM Orderhead WHERE 1 AND Orderhead.InsertTime >= '0001-01-01 00:00:00' AND Employee = 'TK' AND TYPE NOT IN ('WebShop')
AND `Orderline`.`OrderUUID` = `Orderhead`.`UUID`
) ORDER BY Orderline.Number
我还增加了net_read_timeout,connect_timeout,max_allowed_packet,因为链接表示https://dev.mysql.com/doc/refman/5.7/en/error-lost-connection.html, 但是没有运气。我是从SQLyog查询窗口运行的。设置了新的增量值。但是没有运气。我是否需要重新启动服务器才能生效?
在“加入,存在与存在”中哪个是最好的?如何添加索引(在哪些字段上)以获得最佳优化? 如何在不考虑缓存的情况下运行查询?