我有以下问题:
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命令运行查询时,我发现的唯一区别如下所示:
有人知道要寻找什么吗?是什么导致性能上的差异?
请记住,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] 删除。
我来说两句