mysql查询慢

玛丽安·泽克·塞达杰(Mariann ZekeŠedaj)

我有以下问题:

MySQL数据库有2个是原始数据库,而Database_1是第一个数据库,只有很少的更改(一些新列,不同的数据),这两个数据库是原始数据库。

当我运行涉及数据库中3个表的查询时,我会得到非常不同的性能结果。我正在同一台本地主机服务器上测试这两个数据库。

询问:

SELECT `Applicant`.`id`, `Applicant`.`name`, `User`.`login`, `User`.`id`, Project.id 
FROM `applicants` AS `Applicant`
LEFT JOIN `authake_users` AS `User` ON (`Applicant`.`authake_user_id` = `User`.`id`)
LEFT JOIN `projects` AS `Project` ON (`Project`.`applicant_id` = `Applicant`.`id`)
WHERE `User`.`login` LIKE _latin1 '%1000%' AND `Project`.`id` IS NULL;

查询执行时间:

Database_1 – 0.3 s –尽管速度更快,但该数据库是较大的数据库

数据库_2 – 1分40秒

所有3个表都使用MyISAM引擎。表的申请人和项目的字符集为utf8,表authake_users的字符集为latin1。

我检查了索引(两个数据库都具有完全相同的索引),对其进行了重建,并在所有3个表上都使用了ANALYZE和OPTIMIZE,但均未成功。

当我在前面使用EXPLAIN命令运行查询时,我发现的唯一区别如下所示:

数据库_1 在此处输入图片说明

数据库_2 在此处输入图片说明

有人知道要寻找什么吗?是什么导致性能上的差异?

伊姆兰·扎霍尔

请记住,MySql查询分析器根据可用资源内存选择优化计划。但是,更改表及其JOIN计划的顺序确实有助于它选择更好的计划。

我无权访问数据库,而且我不知道您从此查询中需要的输出,因此无法执行分析。但是以下是一些建议,您可以尝试一下

您的查询没有 WHERE

SELECT `Applicant`.`id`, `Applicant`.`name`, `User`.`login`, `User`.`id`, Project.id 
FROM `applicants` AS `Applicant`
LEFT JOIN `authake_users` AS `User` 
    ON `Applicant`.`authake_user_id` = `User`.`id` 
    AND `User`.`login` LIKE _latin1 '%1000%'
LEFT JOIN `projects` AS `Project` 
    ON `Project`.`applicant_id` = `Applicant`.`id` 
    AND `Project`.`id` IS NULL;

通过更改JOINS和不更改顺序WHERE

SELECT `Applicant`.`id`, `Applicant`.`name`, `User`.`login`, `User`.`id`, Project.id 
FROM `authake_users` AS `User` 
LEFT JOIN `applicants` AS `Applicant` 
    ON `Applicant`.`authake_user_id` = `User`.`id` 
    AND `User`.`login` LIKE _latin1 '%1000%'
LEFT JOIN `projects` AS `Project` 
    ON `Project`.`applicant_id` = `Applicant`.`id` 
    AND `Project`.`id` IS NULL;

通过更改JOINS-1的顺序查询

SELECT `Applicant`.`id`, `Applicant`.`name`, `User`.`login`, `User`.`id`, Project.id 
FROM `authake_users` AS `User`
LEFT JOIN `applicants` AS `Applicant` 
    ON `Applicant`.`authake_user_id` = `User`.`id`
LEFT JOIN `projects` AS `Project` 
    ON `Project`.`applicant_id` = `Applicant`.`id`
WHERE `User`.`login` LIKE _latin1 '%1000%' AND `Project`.`id` IS NULL;

通过更改JOINS-2的顺序查询

SELECT `Applicant`.`id`, `Applicant`.`name`, `User`.`login`, `User`.`id`, Project.id 
FROM `projects` AS `Project`
LEFT JOIN `applicants` AS `Applicant` 
    ON `Project`.`applicant_id` = `Applicant`.`id`
LEFT JOIN `authake_users` AS `User` 
    ON `Applicant`.`authake_user_id` = `User`.`id` 
WHERE `User`.`login` LIKE _latin1 '%1000%' AND `Project`.`id` IS NULL;

另外,如果您想充分利用索引,User.login LIKE _latin1 '%1000%'则应避免这种情况。如果确实需要,最好使用这样的东西User.login LIKE _latin1 '1000%'

如果您也可以发布EXPLAIN我建议的查询,我将非常感兴趣

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章