Mysql 优化SQL查询

Mysql 优化SQL查询,mysql,sql,query-optimization,Mysql,Sql,Query Optimization,表模式 对于这两个表,创建查询如下所示: 表1:文件路径键、目录路径键 创建表1文件路径键varchar500,目录路径键 varchar500,主键文件路径键引擎=innodb 例如,file_path_key=/home/playstation/a.txt dir\u path\u key=/home/playstation/ 表2:文件路径密钥、散列密钥 创建表Table2文件路径键varchar500非空,哈希键 bigint20非空,外键文件\路径\键引用 表1删除级联上更新级联上的文

表模式

对于这两个表,创建查询如下所示:

表1:文件路径键、目录路径键

创建表1文件路径键varchar500,目录路径键 varchar500,主键文件路径键引擎=innodb

例如,file_path_key=/home/playstation/a.txt dir\u path\u key=/home/playstation/

表2:文件路径密钥、散列密钥

创建表Table2文件路径键varchar500非空,哈希键 bigint20非空,外键文件\路径\键引用 表1删除级联上更新级联上的文件路径键 引擎=innodb

目标:

在这种情况下,表1有大约40000个条目,表2有5000000个条目,这使得我当前的查询速度非常慢

从表1中选择不同的s1.file\u path\u key作为s1 join select*从表2中选择,其中hash\u key=H作为s1.file\u path\u key=s2.file\u path\u key和s1.dir\u path\u key上的s2=D


我建议首先将表2中的条目选择到临时表中:

SELECT * FROM Table2 INTO #Temp WHERE hash_key = H
然后在SELECT语句中加入临时表:

select distinct s1.file_path_key from Table1 as s1 join #Temp as s2 on s1.file_path_key = s2.file_path_key and s1.dir_path_key !=D;

子选择确实不必要地减慢了查询速度

您应该删除它,并将其替换为一个简单的联接,将所有与联接无关的条件向下推到WHERE子句中

此外,还应在Table1.dir\u path\u键和Table2.hash\u键列上添加索引:

ALTER TABLE Table1
  ADD INDEX dir_path_key dir_path_key(255);

ALTER TABLE Table2
  ADD INDEX hash_key (hash_key);
对于查询,请尝试以下操作:

select distinct s1.file_path_key 
from Table1 as s1 
join Table2 as s2 on s1.file_path_key = s2.file_path_key
where s1.dir_path_key !=D
and s2.hash_key =H;

这对查询执行时间有影响吗?我在过去实践时通常会注意到一个相当大的差异。当然,我会试试这个。如何向列添加索引?我添加了用于创建索引的示例DDL。请注意,这会将表锁定几分钟,因此您不应该在实时生产数据库上执行此操作。在我的用例中填充表后,表不会更新。所以这不应该是个问题吗?对不起,我迟到了一点,但是添加索引非常有效!选择查询现在快多了!谢谢你,艾克!密钥的潜在大小显然没有帮助。看起来你不需要潜在的关键范围——你会考虑切换到你加入的Auto Gen主键吗?这将大大减少表的大小——首先,这意味着可以将file_path_键转换为文件,这可能会减少不匹配。遗憾的是,您没有使用支持递归CTE的RDBMS——它们非常适合于文件夹结构。
select distinct s1.file_path_key 
from Table1 as s1 
join Table2 as s2 on s1.file_path_key = s2.file_path_key
where s1.dir_path_key !=D
and s2.hash_key =H;