Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何加速这个mysql连接查询_Mysql_Indexing_Query Optimization_Explain - Fatal编程技术网

如何加速这个mysql连接查询

如何加速这个mysql连接查询,mysql,indexing,query-optimization,explain,Mysql,Indexing,Query Optimization,Explain,我有以下查询,需要很长时间(大约1分钟): 通过将表“shift”中“operator_id”列的数据大小从VARCHAR 255更改为VARCHAR 16,并将表“transaction”中该列的数据类型从TEXT更改为VARCHAR 16,我可以加快查询速度(大约25%)。然而,我仍然需要更多的加速(可能通过添加更多索引或更改它们?) 这是解释的结果: 我已经读到,如果列“可能的_键”为空,则没有相关的索引。所以,我想知道是否有人能帮助我理解我是否选择了正确的索引?以下是我放在表“tran

我有以下查询,需要很长时间(大约1分钟):

通过将表“shift”中“operator_id”列的数据大小从VARCHAR 255更改为VARCHAR 16,并将表“transaction”中该列的数据类型从TEXT更改为VARCHAR 16,我可以加快查询速度(大约25%)。然而,我仍然需要更多的加速(可能通过添加更多索引或更改它们?)

这是解释的结果:

我已经读到,如果列“可能的_键”为空,则没有相关的索引。所以,我想知道是否有人能帮助我理解我是否选择了正确的索引?以下是我放在表“transaction”上的索引:


在您的示例中,我在移位表中看不到运算符id列,因此我不明白更改数据类型如何提高查询性能

如上所述,索引所有要连接的列应该是最好的索引策略,例如,应该为以下字段创建索引:

shift.gs_id
shift.terminal_id  
shift.id  
shift.start_time 
正如Zerkms在下面正确指出的那样,您正在事务表上执行完整的表扫描,因此不需要在那里添加索引


但是,MySQL不会在数据类型不相同的联接上使用索引,例如,不能将具有VARCHAR(32)数据类型的字段与具有INT数据类型的字段联接,并且希望使用索引,因此您应该在联接的两侧使它们相同。如果它们不相同,或者不能更改为相同,那么您的设计就有点可疑。

在您的示例中,我在移位表中看不到运算符id列,因此我不理解更改数据类型如何提高查询性能

如上所述,索引所有要连接的列应该是最好的索引策略,例如,应该为以下字段创建索引:

shift.gs_id
shift.terminal_id  
shift.id  
shift.start_time 
正如Zerkms在下面正确指出的那样,您正在事务表上执行完整的表扫描,因此不需要在那里添加索引


但是,MySQL不会在数据类型不相同的联接上使用索引,例如,不能将具有VARCHAR(32)数据类型的字段与具有INT数据类型的字段联接,并且希望使用索引,因此您应该在联接的两侧使它们相同。如果它们不相同,或者不能更改为相同,那么您的设计就有点可疑。

MySQL很少认为每个表使用一个以上的索引是明智的,因此添加所有这些索引无助于此查询。稍后,我将介绍一个可能会有所帮助的“综合”指数

请为每个表提供
SHOW CREATE TABLE
;我们不得不猜测太多的事情。这可能有助于我们解决您关于
文本
等的问题

该查询是上的一个变体

SELECT a.stuff, b.stuff
    FROM a
    JOIN b ON ...
    -- no WHERE clause
    GROUP BY a...
如果没有
WHERE
子句,它需要扫描一个表中的所有表,并进入另一个表。从哪张桌子开始?可能没关系。那么我们能做些什么呢?还有一种可能性。通过让“复合”索引完全匹配
组,优化器可以使用它来避免“使用临时,使用文件排序”;那会有帮助的

但是,如果
shift
已经具有
主键(id)
,则新的
shift
索引将不起作用。然后是一个问题:“你为什么要加入超过
id
?”

还有一种可能性。。。但是首先。。。哪个表是
fuel\u cost
?聚合中的其余列也是如此(
SUM
,…)。如果它们都在
shift
中,那么可能还有另一种编写查询的方法,可以通过
JOIN
避免可怕的扩展,然后通过
groupby
进行折叠。这才是真正的性能杀手


(re@zerkms)由于数据在表中的结构方式,获取的行数比列数对性能更重要。(我不想说得更具体些,因为
文本
可能会有所不同。)

MySQL很少认为每个表使用一个以上的索引是明智的,因此添加所有这些索引无助于此查询。稍后,我将介绍一个可能会有所帮助的“综合”指数

请为每个表提供
SHOW CREATE TABLE
;我们不得不猜测太多的事情。这可能有助于我们解决您关于
文本
等的问题

该查询是上的一个变体

SELECT a.stuff, b.stuff
    FROM a
    JOIN b ON ...
    -- no WHERE clause
    GROUP BY a...
如果没有
WHERE
子句,它需要扫描一个表中的所有表,并进入另一个表。从哪张桌子开始?可能没关系。那么我们能做些什么呢?还有一种可能性。通过让“复合”索引完全匹配
组,优化器可以使用它来避免“使用临时,使用文件排序”;那会有帮助的

但是,如果
shift
已经具有
主键(id)
,则新的
shift
索引将不起作用。然后是一个问题:“你为什么要加入超过
id
?”

还有一种可能性。。。但是首先。。。哪个表是
fuel\u cost
?聚合中的其余列也是如此(
SUM
,…)。如果它们都在
shift
中,那么可能还有另一种编写查询的方法,可以通过
JOIN
避免可怕的扩展,然后通过
groupby
进行折叠。这才是真正的性能杀手


(re@zerkms)由于数据在表中的结构方式,获取的行数比列数对性能更重要。(我不想说得更具体些,因为
文本
可以起作用。)

好吧,我只是发现我的问题与索引、查询或数据库结构无关。当我在本地服务器上运行查询时,查询速度很快,而在live db上则非常快