这种特殊情况可能看起来有些愚蠢,但是我只想知道我应该如何解决:有一张桌子(学校),在这张桌子中,您可以找到所有带有其学校ID的学生。该顺序是完全随机的,但是可以使用SELECT语句对其进行排序。
CREATE TABLE schools (school_id int, name varchar(32), age ...);
现在,我想按他的名字(用LIKE'%name%')搜索学生,但前提是他在某所学校中。 我已经尝试过了:
SELECT * FROM `schools` WHERE `school_id` = 33 and `name` LIKE '%max%';
但是后来我意识到,我还可以使用诸如以下的子查询:
SELECT * FROM (SELECT * FROM `schools` WHERE `school_id` = 33) AS a
WHERE a.name LIKE '%max%';
哪种方法效率更高/性能更高?
答案 0 :(得分:2)
您可以使用EXPLAIN
关键字来确切了解每个查询的执行方式。
我想说这两个将完全相同地执行几乎是肯定的。
答案 1 :(得分:1)
查询优化器可能会为两个查询选择相同的计划。如果您想肯定地知道,请在执行每个查询时查看执行计划。
答案 2 :(得分:1)
在MySQL中,没有子查询的查询可能更有效:
SELECT *
FROM `schools`
WHERE `school_id` = 33 and `name` LIKE '%max%';
MySQL具有实现子查询的这种讨厌的趋势-也就是说,实际运行子查询并将其保存为临时表(尽管情况有所改善)。大多数其他数据库不这样做。因此,在其他数据库中,两者应等效。
即使有其他比较,MySQL也足够聪明,可以为school_id
使用索引(如果有)。如果没有可用的索引,它将进行全表扫描,这很可能会影响性能。