|
|
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Добрый день! Читаю статьи про индексы в mysql, и увидел в некоторых постах, что при использовании индексов, может быть такое что возвращаются неверные данные, или вообще не возвращаются, правда ли это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 12:48:48 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Scorpion15и увидел в некоторых постахвы ещё на заборах "посты" почитайте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 12:56:23 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Пожалуй, один случай такого поведения я могу представить. Это когда в секции SELECT пишут поле без агрегатных функций, которого нет в группировке. Правда, такой запрос я бы изначально не считал корректным. Но случаются упертые товарищи, у которых "все работает". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 13:08:41 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Т.е. если запрос: SELECT max(*) FROM table GROUP BY id Он может отработаться некорректно при использовании индексов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 13:19:54 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Scorpion15Т.е. если запрос: SELECT max(*) FROM table GROUP BY id Он может отработаться некорректно при использовании индексов?Такой запрос в принципе не может отработать, в нем синтаксическая ошибка. А я говорил про запросы такого рода: Код: sql 1. 2. 3. Значения для поля field2 будет взято из произвольной записи в пределах группы. И появление/удаление индекса может привести к тому, что оно будет взято из другой записи, нежели раньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 13:23:31 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Нет, такой запрос вообще не отработает. А вот Код: sql 1. может изменить результат в зависимости от имеющихся на данный момент индексов. Вообще-то он в принципе не обязан выдавать одни и те же данные, но как правило этого не происходит (то, что те самые упёртые товарищи называют "всё работает"). А создание/удаление индексов может ситуацию изменить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 13:25:57 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Т.е. проблемы могут возникнуть только при агрегатных функциях? А с остальным проблем быть не должно? А если все таки надо выполнить такой запрос: Код: sql 1. И до индексов допустим все работает нормально, а после нет, то как быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 15:02:52 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Scorpion15Т.е. проблемы могут возникнуть только при агрегатных функциях?В моем примере вообще нет агрегатных функций. Они тут ни причем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 15:38:53 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Scorpion15А если все таки надо выполнить такой запрос: Код: sql 1. И до индексов допустим все работает нормально, а после нет, то как быть?Переписывать. Причем независимо от того, что кажется, как будто работает нормально. Единственное исключение, когда можно ожидать стабильного результат такого запроса - это когда field1 уникальное поле или первичный ключ той же таблицы, откуда берется поле field2, а группировка делается для того, чтобы скрыть дубли, появляющиеся от соединения с другой таблицей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 15:42:17 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Но как я понимаю если field1 одинаковое в пределах группы, но не имеет индекса, запрос будет всегда корректен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 15:56:36 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Scorpion15Но как я понимаю если field1 одинаковое в пределах группы, но не имеет индекса, запрос будет всегда корректен?field1 будет автоматически одинаковым в пределах группы, т.к. группировка происходит по нему. Примеры несколько искусственные, на практике они обычно более сложные. И тогда, например, может повлиять индекс, который вообще не по полю field1 и не по полю field2, а по какому-то другому, которое участвует в отборе записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 16:06:10 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Scorpion15Добрый день! Читаю статьи про индексы в mysql, и увидел в некоторых постах, что при использовании индексов, может быть такое что возвращаются неверные данные, или вообще не возвращаются, правда ли это? Неправда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 16:53:27 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Из личного опыта: Индекс на поле с типом DATETIME, но в запросе передаю просто дату - SELECT не правильно выбрал данные за период. Делаю DATE(FIELD_DATETIME) - индекс не использует, поэтому надо передавать именно в формате DATETIME, тогда и данные правильно достает и индекс использует. З.Ы. Может сейчас по другому, MySQL был 5.1, и через драйвер ODBC 3.51. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 18:28:37 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Близнец1980Из личного опыта: Индекс на поле с типом DATETIME, но в запросе передаю просто дату - SELECT не правильно выбрал данные за период. Делаю DATE(FIELD_DATETIME) - индекс не использует, поэтому надо передавать именно в формате DATETIME, тогда и данные правильно достает и индекс использует."SELECT не правильно выбрал" - был неверный результат запроса или "не оптимальный" план выполнения запроса? Первого быть не должно. А второе может быть запросто, применением функции DATE вы фактически убили возможность применения индекса, это так и должно быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 18:35:02 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
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, на тот момент последний, но тоже косяк какой-то вылез, сейчас уже не припомню. На данный момент, естественно, все может быть по другому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 19:46:59 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Близнец1980Например есть запись со временем '2015-01-02 02:01:01' и '2015-01-02 20:00:01', кто из них может тупо не попасть с запрос с WHERE datevrem BETWEEN '2015-01-02' AND '2015-01-02'А никто из них и не должен попасть в эту выборку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 19:50:53 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
miksoftА никто из них и не должен попасть в эту выборку. Я что-то пропустил наверно? В реальности там конечно период не один день, а в основном месяц или неделя. Попадали в выборку даты как начала периода так и окончания, только со временем было напутано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 20:06:29 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Близнец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' (т.к. границы совпадают). Если же даты будут разные, то из последней даты будут взяты записи только с нулевым временем. Это все документировано и ни с каким индексами не связано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2015, 20:14:38 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
Вобщем, я понял, что если запросы писать правильно, то и с индексами проблем не будет.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2015, 12:59:35 |
|
||
|
Mysql index
|
|||
|---|---|---|---|
|
#18+
даже если их писать неправильно, то проблемы не в индексах, а с головой пишущего :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2015, 13:12:39 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39112035&tid=1832452]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 208ms |
| total: | 354ms |

| 0 / 0 |
