@mysql_ru

Страница 71 из 142
Yaroslav
17.09.2017
12:21:46
нету, надо создать?
если поиск по дате юзаешь, то да, лучше оптимизировать через индекс

lost
17.09.2017
12:23:20
нет, значит и next key lock не будет. да если бы и был, ничего страшного бы не случилось
ага, если индекса не будет - будет блокировка по праймари что ровняется чему? прааавильно локу всей таблицы

Zaur
17.09.2017
12:23:27
если поиск по дате юзаешь, то да, лучше оптимизировать через индекс
я понял, индекс тогда создам после того как верну все даты на место

Google
lost
17.09.2017
12:26:20
это не бред, это документация)

я понял, индекс тогда создам после того как верну все даты на место
а можно просто брать N записей с лимитом по праймари и сравнивать где не равны даты и обновлять

Alexey
17.09.2017
12:26:52
это какая-то документация из параллельной вселенной

lost
17.09.2017
12:26:54
и никакой индекс не нужен

это какая-то документация из параллельной вселенной
Record locks always lock index records, even if a table is defined with no indexes. For such cases, InnoDB creates a hidden clustered index and uses this index for record locking. Если у тебя будет тип доступа ALL сколько строк ты заблокируешь?

Alexey
17.09.2017
12:28:30
ой, так ну это ж не о том совсем

lost
17.09.2017
12:28:44
а о чем же?

Alexey
17.09.2017
12:29:40
о том, что если таблица определена без индексов, то создаётся скрытый clustered index из row id

lost
17.09.2017
12:29:58
Если у тебя будет тип доступа ALL сколько строк ты заблокируешь?

даже по кластерному индексу

Проведи простой эксперимент: START TRANSACTION; SELECT * FROM foo f WHERE f.entity <> 1 FOR UPDATE; COMMIT; START TRANSACTION; SELECT * FROM foo f WHERE f.id = 2 FOR UPDATE; COMMIT;

выполни две транзакции параллельно с условием что в первой транзакции выборка идет по колонке, на которой нет индекса

а во второй выборка по праймари

Google
lost
17.09.2017
12:35:13
конструкция FOR UPDATE даёт тот же лок что и UPDATE и DELETE

Alexey
17.09.2017
12:42:13
ох щщи

значит UPDATE на таблице на 9 миллионов записей поставит record (не next-key) локи на все обновляемые записи. это независимо от того, какой индекс используется (и используется ли вообще)

да, параллельным update-ам на те записи, которые уже были заблокированы, придётся подождать

это однако не имеет ничего общего с блокировкой таблиц. особенно в случае insert (append-only) запросов — они вообще никаких блокировок не увидят

Zaur
17.09.2017
12:44:52
паралельных апдейтов не будет, приложение в эту таблицу только добавляте новые строки и все

Alexey
17.09.2017
12:45:11
да. но нет

lost
17.09.2017
12:45:35
есть такая штука как блокировка автоинкремента, например

Alexey
17.09.2017
12:46:22
есть, да. не про нас это

lost
17.09.2017
12:48:34
есть, да. не про нас это
ну замени во второй транзакции селект на insert )

потом вместе посмеемся)

Alexey
17.09.2017
12:50:01
да я как бы и не смеюсь. в какой второй транзакции?

Alexey
17.09.2017
12:51:01
так там две транзакции делают SELECT FOR UPDATE на всю таблицу. это вообще каким боком здесь?

lost
17.09.2017
12:51:18
во первых не на всю

Alexey
17.09.2017
12:51:35
можно было просто сделать select get_lock() и сказать: "вот, видишь, блокировки!"

lost
17.09.2017
12:51:47
@etkee ты удачно зашел, присоединяйся, бери попкорн

Alexey
17.09.2017
12:51:50
ну, там пример подобран так, чтобы их заблокировать

lost
17.09.2017
12:52:01
можно было просто сделать select get_lock() и сказать: "вот, видишь, блокировки!"
эти блокировки не имеют ничего общего с блокировкой строк

Google
Alexey
17.09.2017
12:52:17
так и пример ничего общего не имеет

Fike
17.09.2017
12:52:24
да я давно смотрю и ничего не понимаю, не спал слегка. потому и попытался stackoverflow здесь набрать.

lost
17.09.2017
12:52:25
Почему же?

Alexey
17.09.2017
12:52:47
а почему же имеют?

lost
17.09.2017
12:52:51
так и пример ничего общего не имеет
я сэмулировал тебе блокировку всей таблицы селектом

точно такую же

как и при блокировке апдейтом

Alexey
17.09.2017
12:53:19
ну круто. я предложил более короткий вариент "блокировки всей таблицы"

ну, во-первых она не точно такая же. подумай про isolation levels, например

lost
17.09.2017
12:54:08
ну, во-первых она не точно такая же. подумай про isolation levels, например
такая же, и при одинаковом уровне изоляции результат тот же

Alexey
17.09.2017
12:55:19
а во-вторых, даже в твоём примере блокировки таблицы нет. оно к конце выполнения заблокирует все записи. ну круто, да. и это доказывает, что UPDATE на всю таблицу всю таблицу же и заблокирует?

lost
17.09.2017
12:55:59
а, то есть все записи таблицы это не вся таблица да?

сложный прикол

Yaroslav
17.09.2017
12:56:33
а если вся таблица, то insert незя

lost
17.09.2017
12:56:53
новые могут insert делать
я не с проста написал потом

попробуй во второй транзакции заменить селект на вставку

Yaroslav
17.09.2017
12:57:30
так ты лочишь всю таблицу

специально через for update

Alexey
17.09.2017
12:57:39
а update может выполняться минутами и часами. и чем дольше он выполняется, тем разница между "заблокированы обновлённые записи" и "заблокирована вся таблица" становится очевиднее

Google
lost
17.09.2017
12:58:12
Блин, ребят, смысла спорить нет, потратьте 5 минут своего драгоценного времени, проверьте

Alexey
17.09.2017
12:58:24
а, ну ok

Yaroslav
17.09.2017
12:58:39
никто не спорит

уже спор о названиях

Alexey
17.09.2017
12:59:27
не даст выполнить именно из-за for update кстати

Yaroslav
17.09.2017
12:59:53
Alexey
17.09.2017
13:00:14
@acromegale слушай, у меня мысль возникла. а вы с @etkee не бадушники случайно?

Fike
17.09.2017
13:00:27
вот это прям оскорбление века было

Alexey
17.09.2017
13:00:39
ok. да нет, я просто подумал, ничего лично :)

Fike
17.09.2017
13:00:49
да я не серьезно

lost
17.09.2017
13:01:19
не даст выполнить именно из-за for update кстати
for update вешает такой же exclusive lock как и апдейт и делит - селекты чисто для наглядности

Fike
17.09.2017
13:01:26
но в дейтинг вообще никогда не пойду, как и в продажу спиннеров, вейпов, казино, мфо, бинарные опционы и прочие эм вакансии

Alexey
17.09.2017
13:03:34
for update вешает такой же exclusive lock как и апдейт и делит - селекты чисто для наглядности
for update использует именно next-key locks. которые не используются в update при read-committed, например

lost
17.09.2017
13:04:28
for update использует именно next-key locks. которые не используются в update при read-committed, например
хорошо, выполни вместо селектов апдейт - результат будет тот же

и да, кстати

Alexey
17.09.2017
13:04:56
да даже растяни свой собственный пример на 9 миллионов строк. потом прикинь, какую часть времени будут заблокированы insert-ы

lost
17.09.2017
13:05:00
разговор был за обновление по колонке без индекса

Alexey
17.09.2017
13:05:16
а это всё равно. ну будет индекс, и что?

Google
lost
17.09.2017
13:06:14
будет индекс - будут заблокированы только записи по этому индексу, которые подходят по условию без индекса будет фулл тейбл

блин, мне уже чесслово надоело

Alexey
17.09.2017
13:06:38
какому условию? мы про full-table update говорим

lost
17.09.2017
13:08:12
Обновление всей таблицы или обновление n строк по неиндексной колонке одинаково блокирует все записи

сколько раз я еще это должен сказать

чтобы вы поняли

Alexey
17.09.2017
13:10:55
да мы поняли. но мой вопрос без ответа остался

lost
17.09.2017
13:11:02
какой именно

Alexey
17.09.2017
13:11:30
или вот ещё вопрос на засыпу: может ли update по неиндексной колонке использовать индекс?

какой именно
какому условию? мы про full-table update говорим

вот этот

lost
17.09.2017
13:12:55
или вот ещё вопрос на засыпу: может ли update по неиндексной колонке использовать индекс?
он будет использовать праймари, иначе как ты реализуешь блокировку на уровне строк

какому условию? мы про full-table update говорим
тут я имел ввиду что ты будешь отфильтровывать в where

lost
17.09.2017
13:15:41
Хорошо, давай верный

Alexey
17.09.2017
13:36:24
правильный ответ: UPDATE может использовать любой доступный индекс (или не использовать вообще) на усмотрение оптимизатора. для блокировок строк pimary key не требуется

lost
17.09.2017
13:38:02
Хорошо, что тогда используется для блокировки строки если нет индекса ?

Alexey
17.09.2017
13:48:20
Хорошо, что тогда используется для блокировки строки если нет индекса ?
блокировка строки — это такая сущность, которая вообще не привязана к индексам. она состоит из номера tablespace-а, номер страницы и битовой маски заблокированных на странице записей

Muzaffar
17.09.2017
16:30:29
мужики какими IDE пользуетесь под линукс?

есть ли IDE на подобие dbForge под линукс?

Страница 71 из 142