MySQL выполняет запрос быстрее как подзапрос, чем обычный - PullRequest
1 голос
/ 09 марта 2011

Может кто-нибудь сказать мне, почему этот метод подзапроса быстрее, чем простой запрос?Насколько я могу судить, они теоретически идентичны: S

SELECT
    temp.`[thing]`,
FROM ( SELECT 
    `[thing]`
FROM 
    `[table]`  
WHERE 
    [things] ) temp

быстрее, чем:

SELECT 
    `[thing]`
FROM 
    `[table]`  
WHERE 
    `[things]`

Тот, что в подзапросе, более чем в 5 раз быстрее ...

Может кто-нибудь сказать мне, что в моей конфигурации может вызвать такую ​​проблему?

Приветствия.

Учитывая, что довольно много людей не получили вопрос, который я перефразирую.Запросы делают то же самое.Они одинаковы, но в одном результат ссылается на внешний запрос, а в другом просто.

SELECT `name` FROM `members` WHERE `member_id` = 1

или

SELECT tmp.`name` FROM ( SELECT `name` FROM `members` WHERE `member_id` = 1 ) tmp

Допустим, элемент member_id является первичным ключом и является единственнымindex of members.

Любую другую информацию, которую вы хотите узнать об этой странной проблеме, просто спросите в комментарии, и я предоставлю.Я не знаю, что является причиной этой проблемы, просто не предоставив вам полную информацию о моих настройках. Отсюда и отсутствие общей информации, и вопрос заключается в том, «что в моей настройке может вызвать это».

Сделайте это сами,запустите универсальный оператор SELECT, затем снова запустите его с самим собой в подзапросе и посмотрите, работает ли он быстрее в вашей системе.

Редактировать: принятый ответ на самом деле не является ответом, но это единственный ответ, которым я былучитывая, что я закрою вопрос.

Ответы [ 2 ]

0 голосов
/ 10 марта 2011

Единственное правдоподобное объяснение - кеширование.Не только кэширование MySQL, но и кэширование на уровне ОС, например, дисковое кэширование.Даже если вы используете директиву кэширования SQL_NO_CACHE, это означает, что MySQL не будет кэшировать этот результат запроса.MySQL по-прежнему будет кэшировать индекс и таблицу с помощью обычных методов кэширования.

Вам действительно нужно убедиться, что вы кешируете в чистом виде, а затем отмените запросы, выполнив сначала суб-выбор.Тогда посмотри, получишь ли ты такой же результат.Кроме того, вы должны запустить их оба раза.Весьма вероятно, что вы увидите, что только первый запрос является «медленным».

0 голосов
/ 10 марта 2011

Это опечатка или вы предварительно фильтруете таблицу в подвыборке?

[things] против [thing] в WHERE заявлениях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...