За последние 24 часа нас посетили 18175 программистов и 1593 робота. Сейчас ищут 690 программистов ...

ORDER и SELECT выполняются до WHERE

Тема в разделе "MySQL", создана пользователем mirosas, 11 авг 2024.

  1. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    236
    Симпатии:
    5
    MySQL версии 5.6.25 - проблемы с производительностью запросов Select where order limit. Начал пытаться смотреть что к чему. Судя по времени выполнения различных запросов, складывается впечатление, что сперва выполняется ORDER, затем в цикле ( SELECT, затем WHERE), цикл длится до тех пор, пока не будет достигнут LIMIT. Можно как-то заставить сперва выполнять WHERE, потом ORDER BY, потом SELECT LIMIT ?

    Как я это понял. Создал таблицу:

    CREATE TABLE `test` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `rating1` int(11),
    `rating2` int(11),
    `text` varchar(240) CHARACTER SET utf8
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    ALTER TABLE `test`
    ADD PRIMARY KEY (`id`),
    ADD KEY `rating1` (`rating1`),
    ADD KEY `rating2` (`rating2`);

    Затем накидал в нее данных:
    INSERT INTO `test`(`rating1`, `rating2`, `text`) VALUES (round(7654321*rand(),0),round(7654321*rand(),0),repeat(md5(rand()),6));
    - повторить несколько сотен тысяч раз.

    Затем создал особый порядок данных в таблице:
    UPDATE test SET rating2=NULL WHERE rating1>3500000;

    А затем запустил два запроса:
    SELECT * FROM test WHERE rating2 IS NOT NULL ORDER by rating1 DESC LIMIT 10;
    - выполняется долго.

    SELECT * FROM test WHERE rating2 IS NOT NULL ORDER by rating1 ASC LIMIT 10;
    - выполняется быстро

    - ни чем иным такое поведение, кроме как сперва выполнение ORDER, затем SELECT LIMIT, pзатем WHERE я объяснить это не могу.
     
    #1 mirosas, 11 авг 2024
    Последнее редактирование: 11 авг 2024
  2. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    914
    Симпатии:
    143
    В суть не вникал, EXPLAIN что говорит?
     
  3. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    425
    Симпатии:
    79
    Адрес:
    Бавария, Германия
    Добрый день!

    Повтрил Ваш эксперимент.

    Создал такую же таблицу (MySQL 5.7 - Win10)
    Записал 114914 записей. В PhpMyAdmin
    Это запрос не делал (rating2 во всех записях NOT NULL)
    Код (Text):
    1. UPDATE test SET rating2=NULL WHERE rating1>3500000;
    В PhpMyAdmin несколько раз протестировал два запроса с DESC и ASC.
    При повторение запросов наблюдается разброс по времени, но продолжительность в обоих случаях совпадает.

    Код (Text):
    1. SELECT * FROM test WHERE rating2 IS NOT NULL ORDER by rating1 DESC LIMIT 10;
    2. Zeige Datensätze 0 - 9 (10 insgesamt, Die Abfrage dauerte 0,0001 Sekunden.) [rating1: 7654201... - 7653750...]
    3.  
    4. SELECT * FROM test WHERE rating2 IS NOT NULL ORDER by rating1 ASC LIMIT 10;
    5. Zeige Datensätze 0 - 9 (10 insgesamt, Die Abfrage dauerte 0,0001 Sekunden.) [rating1: 28... - 786...]
    DE: Zeige Datensätze 0 - 9 (10 insgesamt, Die Abfrage dauerte 0,0001 Sekunden.) [rating1: 28... - 786...]
    RU: Показаны записи 0–9 (всего 10, запрос занял 0,0001 секунды.)

    Удачи!
     
    #3 Vladimir Kheifets, 13 авг 2024
    Последнее редактирование: 13 авг 2024