Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Mysql index / 21 сообщений из 21, страница 1 из 1
24.11.2015, 12:48:48
    #39111993
Scorpion15
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Добрый день!
Читаю статьи про индексы в mysql, и увидел в некоторых постах, что при использовании индексов, может быть такое что возвращаются неверные данные, или вообще не возвращаются, правда ли это?
...
Рейтинг: 0 / 0
24.11.2015, 12:56:23
    #39112000
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Scorpion15и увидел в некоторых постахвы ещё на заборах "посты" почитайте
...
Рейтинг: 0 / 0
24.11.2015, 13:08:41
    #39112015
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Пожалуй, один случай такого поведения я могу представить.
Это когда в секции SELECT пишут поле без агрегатных функций, которого нет в группировке.
Правда, такой запрос я бы изначально не считал корректным. Но случаются упертые товарищи, у которых "все работает".
...
Рейтинг: 0 / 0
24.11.2015, 13:19:54
    #39112032
Scorpion15
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Т.е. если запрос:
SELECT max(*) FROM table GROUP BY id
Он может отработаться некорректно при использовании индексов?
...
Рейтинг: 0 / 0
24.11.2015, 13:23:31
    #39112035
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Scorpion15Т.е. если запрос:
SELECT max(*) FROM table GROUP BY id
Он может отработаться некорректно при использовании индексов?Такой запрос в принципе не может отработать, в нем синтаксическая ошибка.

А я говорил про запросы такого рода:
Код: sql
1.
2.
3.
SELECT field1, field2
FROM mytable
GROUP BY field1

Значения для поля field2 будет взято из произвольной записи в пределах группы. И появление/удаление индекса может привести к тому, что оно будет взято из другой записи, нежели раньше.
...
Рейтинг: 0 / 0
24.11.2015, 13:25:57
    #39112039
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Нет, такой запрос вообще не отработает.
А вот
Код: sql
1.
select a,b,max(c) from table group by a

может изменить результат в зависимости от имеющихся на данный момент индексов.
Вообще-то он в принципе не обязан выдавать одни и те же данные, но как правило этого не происходит (то, что те самые упёртые товарищи называют "всё работает"). А создание/удаление индексов может ситуацию изменить.
...
Рейтинг: 0 / 0
24.11.2015, 15:02:52
    #39112202
Scorpion15
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Т.е. проблемы могут возникнуть только при агрегатных функциях? А с остальным проблем быть не должно?
А если все таки надо выполнить такой запрос:
Код: sql
1.
select a,b,max(c) from table group by a


И до индексов допустим все работает нормально, а после нет, то как быть?
...
Рейтинг: 0 / 0
24.11.2015, 15:38:53
    #39112291
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Scorpion15Т.е. проблемы могут возникнуть только при агрегатных функциях?В моем примере вообще нет агрегатных функций. Они тут ни причем.
...
Рейтинг: 0 / 0
24.11.2015, 15:42:17
    #39112300
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Scorpion15А если все таки надо выполнить такой запрос:
Код: sql
1.
select a,b,max(c) from table group by a



И до индексов допустим все работает нормально, а после нет, то как быть?Переписывать.
Причем независимо от того, что кажется, как будто работает нормально.

Единственное исключение, когда можно ожидать стабильного результат такого запроса - это когда field1 уникальное поле или первичный ключ той же таблицы, откуда берется поле field2, а группировка делается для того, чтобы скрыть дубли, появляющиеся от соединения с другой таблицей.
...
Рейтинг: 0 / 0
24.11.2015, 15:56:36
    #39112329
Scorpion15
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Но как я понимаю если field1 одинаковое в пределах группы, но не имеет индекса, запрос будет всегда корректен?
...
Рейтинг: 0 / 0
24.11.2015, 16:06:10
    #39112344
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Scorpion15Но как я понимаю если field1 одинаковое в пределах группы, но не имеет индекса, запрос будет всегда корректен?field1 будет автоматически одинаковым в пределах группы, т.к. группировка происходит по нему.

Примеры несколько искусственные, на практике они обычно более сложные. И тогда, например, может повлиять индекс, который вообще не по полю field1 и не по полю field2, а по какому-то другому, которое участвует в отборе записей.
...
Рейтинг: 0 / 0
24.11.2015, 16:53:27
    #39112430
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Scorpion15Добрый день!
Читаю статьи про индексы в mysql, и увидел в некоторых постах, что при использовании индексов, может быть такое что возвращаются неверные данные, или вообще не возвращаются, правда ли это?

Неправда.
...
Рейтинг: 0 / 0
24.11.2015, 18:28:37
    #39112545
Близнец1980
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Из личного опыта:
Индекс на поле с типом DATETIME, но в запросе передаю просто дату - SELECT не правильно выбрал данные за период.
Делаю DATE(FIELD_DATETIME) - индекс не использует, поэтому надо передавать именно в формате DATETIME, тогда и данные правильно достает и индекс использует.

З.Ы. Может сейчас по другому, MySQL был 5.1, и через драйвер ODBC 3.51.
...
Рейтинг: 0 / 0
24.11.2015, 18:35:02
    #39112549
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Близнец1980Из личного опыта:
Индекс на поле с типом DATETIME, но в запросе передаю просто дату - SELECT не правильно выбрал данные за период.
Делаю DATE(FIELD_DATETIME) - индекс не использует, поэтому надо передавать именно в формате DATETIME, тогда и данные правильно достает и индекс использует."SELECT не правильно выбрал" - был неверный результат запроса или "не оптимальный" план выполнения запроса?
Первого быть не должно.
А второе может быть запросто, применением функции DATE вы фактически убили возможность применения индекса, это так и должно быть.
...
Рейтинг: 0 / 0
24.11.2015, 19:46:59
    #39112612
Близнец1980
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
miksoftSELECT не правильно выбрал - был неверный результат запроса или "не оптимальный" план выполнения запроса?
Первого быть не должно.
А второе может быть запросто, применением функции DATE вы фактически убили возможность применения индекса, это так и должно быть.
Именно "был неверный результат запроса", я так и не понял почему, скорее всего из-за драйвера .
При тестировании на реальных данных не все записи попадали в выборку.
Например есть запись со временем '2015-01-02 02:01:01' и '2015-01-02 20:00:01', кто из них может тупо не попасть с запрос с WHERE datevrem BETWEEN '2015-01-02' AND '2015-01-02' я х.з., наверно зависело от положения солнца в небе:).
Если бы реально не столкнулся с этим - не писал бы. После обнаружения этого бага использую только выражение BETWEEN TimeStamp(DateFirst, '00:00:00') AND TimeStamp(DateLast, '23:59:59').
З.Ы. Еще раз MySQL 5.1.32, драйвер ODBC 3.51.27, Подключение через ADO, DELPHI 7, год 2009. Пробовал драйвер 5.1, на тот момент последний, но тоже косяк какой-то вылез, сейчас уже не припомню. На данный момент, естественно, все может быть по другому.
...
Рейтинг: 0 / 0
24.11.2015, 19:50:53
    #39112614
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Близнец1980Например есть запись со временем '2015-01-02 02:01:01' и '2015-01-02 20:00:01', кто из них может тупо не попасть с запрос с WHERE datevrem BETWEEN '2015-01-02' AND '2015-01-02'А никто из них и не должен попасть в эту выборку.
...
Рейтинг: 0 / 0
24.11.2015, 20:06:29
    #39112628
Близнец1980
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
miksoftА никто из них и не должен попасть в эту выборку.
Я что-то пропустил наверно?
В реальности там конечно период не один день, а в основном месяц или неделя.
Попадали в выборку даты как начала периода так и окончания, только со временем было напутано.
...
Рейтинг: 0 / 0
24.11.2015, 20:14:38
    #39112634
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Близнец1980miksoftА никто из них и не должен попасть в эту выборку.
Я что-то пропустил наверно?
В реальности там конечно период не один день, а в основном месяц или неделя.
Попадали в выборку даты как начала периода так и окончания, только со временем было напутано.При сравнении даты и даты со временем первая из них расширяется до 'дата 00:00:00'.
Т.е. BETWEEN '2015-01-02' AND '2015-01-02' будет расширено до BETWEEN '2015-01-02 00:00:00' AND '2015-01-02 00:00:00', что эквивалентно = '2015-01-02 00:00:00' (т.к. границы совпадают).
Если же даты будут разные, то из последней даты будут взяты записи только с нулевым временем.

Это все документировано и ни с каким индексами не связано.
...
Рейтинг: 0 / 0
25.11.2015, 12:59:35
    #39113048
Scorpion15
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
Вобщем, я понял, что если запросы писать правильно, то и с индексами проблем не будет....
...
Рейтинг: 0 / 0
25.11.2015, 13:12:39
    #39113062
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
даже если их писать неправильно, то проблемы не в индексах, а с головой пишущего :)
...
Рейтинг: 0 / 0
25.11.2015, 15:00:23
    #39113199
Scorpion15
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mysql index
))) Согласен!
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Mysql index / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]