За последние 24 часа нас посетили 22647 программистов и 1269 роботов. Сейчас ищут 770 программистов ...

Разные результаты при одном запросе

Тема в разделе "MySQL", создана пользователем Deonis, 1 окт 2018.

Метки:
  1. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Приветствую, господа!
    Возникла проблема и нужно определиться в причине. Выполняю один и тот же запрос с сортировкой и лимитом в консоли, phpMyAdmin и через раз-другой, выдаются абсолютно разные результаты. То, что дело не в запросе - это примерно 110% из 100, т.к. на локалке всё работает идеально. Разница только в том, что на локалке версия мускула 5.5.53, а на боевом - 5.5.56.
    Перед тем, как принимать что-то по решению проблемы, хочу спросить, если кто сталкивался с подобным: может ли это быть неправильная конфигурация MySQL или это баг конкретной версии?
     
  2. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Покажите запрос. Там полнотекстового поиска нет случайно?
     
  3. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Нет. Все JOIN-ы и условия выборки идут только по индексированным числовым полям. И я специально акцентировал внимание на том, что сам запрос тут не при чем.
    Я тоже когда-то любил так поумничать... ;) Нужно на форуме ввести правило, где задающий вопрос обязательно указывал: гуглил или нет
     
  5. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    @Deonis Ну не знаю вот любой ответ берешь и вроде все логично.
    Код (Text):
    1. The issue is that InnoDB's estimated statistics vary (they are only estimates, and there is some randomness) so sometimes the optimizer is choosing one plan, sometimes another. You might have to use STRAIGHT_JOIN or some other hint to prevent this flapping back and forth.
    2. I don't think you have a good index on the table for this query. The index_merge query plan is really not very good. Please paste SHOW CREATE TABLE.
     
  6. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Deonis, запрос написан ручками или собирается билдером? Логи смотрели? На экран готовый запрос с ответом выводили? В чём сложность показать реальный запрос тут на форуме?
     
  7. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    @nospiou, видел, но не мой случай, т.к. таблицы MyISAM. Сейчас проверил на соседнем серваке, где версия мускула 5.5.40 и работает зараза, как часы. Естественно, что конфиги на всех трёх мускулах, где тестировал, разные. Вот и думаю: то ли именно версия 5.5.56 глючная, то ли "криво" собралась, то ли дело где-то в конфигах.
    Да ни в чем:
    Код (Text):
    1. SELECT
    2.     `p`.`product_id`,
    3.     `p`.`manufacturer_id`,
    4.     (
    5.       SELECT AVG(`rating`) AS `total`
    6.         FROM `oc_review` `r1`
    7.       WHERE
    8.         `r1`.`product_id` = `p`.`product_id` AND
    9.         `r1`.`status` = 1
    10.       GROUP BY `r1`.`product_id`
    11.     ) AS `rating`,
    12.     `p`.`hits`
    13. FROM `oc_category_path` `cp`
    14.     LEFT JOIN `oc_product_to_category` `p2c` ON (`cp`.`category_id` = `p2c`.`category_id`)
    15.     LEFT JOIN `oc_product` `p` ON (`p2c`.`product_id` = `p`.`product_id`)
    16.     LEFT JOIN `oc_product_description` `pd` ON (`p`.`product_id` = `pd`.`product_id`)
    17.     LEFT JOIN `oc_product_to_store` `p2s` ON (`p`.`product_id` = `p2s`.`product_id`)
    18.     WHERE
    19.       `pd`.`language_id` = 1 AND
    20.       `p`.`status` = 1 AND
    21.       `p`.`quantity` > 0 AND
    22.       `cp`.`path_id` = 118
    23. GROUP BY
    24.       `p`.`product_id`
    25. ORDER BY
    26.       `p`.`sort_order` DESC,
    27.       `p`.`has_discount` DESC
    28. LIMIT 0,24
     
  8. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Припустим. Разницы между таблицами нет? SHOW CREATE TABLE tbl_name
     
  9. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Один в один.
    Ок, если пойти методом исключения, то может ли какой-то параметр конфига влиять на такое поведение? Я сам в этом сомневаюсь, хоть и не особо силён в настройках, но гипотетически такой вариант не отбрасываю.
     
  10. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    @Deonis А вот кто его знает. Я вот вижу GROUP BY без сортировки это не может повлиять?
    Код (Text):
    1. This is a bug in your use of the database. MySQL is quite explicit that when you include columns in the SELECT clause in an aggregation query -- and they are not in the GROUP BY -- then they come from indeterminate rows.
     
    #10 nospiou, 1 окт 2018
    Последнее редактирование: 1 окт 2018
  11. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Хрен его знает... С другой стороны, на других серваках тоже бы влияло. В общем, если еще пару вариантов не внесут ясность, то скорее всего, что придётся спрыгивать на другую версию.
     
  12. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Deonis нравится это.