
Victor
07.02.2018
13:08:28
не придирчивости ради, а интереса для
что плохого в том, что кто-нибудь в этом чате обращается на английском?

Anton
07.02.2018
13:08:57
То, что есть куча необразованного быдла типа меня, которое не поймёт и которому будет обидно?
А ещё хуже - будут те, кто поймёт не так

Victor
07.02.2018
13:13:40
теоретически такой барьер можно решить ботом переводчиком ?

Google

Pavel
07.02.2018
13:20:26
Нельзя, боты не могут нормально переводить

The
07.02.2018
14:33:35
Всем привет, Нашел статью, что пагинацию лучше делать с использованием WHERE id > n, и не юзать LIMIT OFFSET. Насколько статья актуальна? И второй вопрос: как запоминать контекст, если с пагинацией через LIMIT/OFFSET все ясно, то тут сходу не могу сообразить. http://use-the-index-luke.com/no-offset

Victor
07.02.2018
14:40:51
LIMIT OFFSET надежнее. Почему через ID может быть плохо: например ты хранишь ссылки на страницы. В разделе с пагинацией их накопилось 300. Есть в другом разделе 100. Администратор решает переместить из первого раздела страницы во второй. ID остались прежние, а ссылки поменялись.

Anton
07.02.2018
14:40:54
@heavycharged более чем актуально. А вот второго вопроса я если честно не очень понял.
@viczem актуально только если пагинацию щёлкают в момент переноса
Только один момент. Если ключ составной, а выбирается по части ключа, то ид заменить на следующую по порядку часть, чтобы не было filesort!

The
07.02.2018
14:43:29
@heavycharged более чем актуально. А вот второго вопроса я если честно не очень понял.
ну вот допустим пагинация у нас, пользователь открыл 5 страницу, всего 100 результатов на странице, сортировка по дате создания, тогда ORDER BY created_at LIMIT 100 OFFSET 500
это значит что с 500 по 600 результат, отсортировав по created_at
а теперь то же самое, только WHERE id < ?
Как нам узнать, что пользователь на 5 странице с сортировкой по дате создания, какой ID нужно передавать в запросе.
получается что нужно запоминать контекст где пользователь находился в последний раз, и передавать его в URL, допустим: /movies?orderBy=date&last_id=1234

Anton
07.02.2018
14:46:07
Ну так это же не совсем ид)))) Если данные разрознены, то надо либо оставлять оффсет, либо делать другие неприятные вещи. Например, при первом запуске делать агрегацию по ключу (будет быстро) и сохранить позиции between твоих дат.

Victor
07.02.2018
14:48:27
не понимаю чем этот метод лучше LIMIT OFFSET - быстрее отработает? сомневаюсь в этом

The
07.02.2018
14:48:37
да я тоже не понимаю :) просто искал как делать пагинацию правильно))
и заинтересовал данный вопрос, решил спросить у знающих

Google

Anton
07.02.2018
14:49:11
"вроде в последнем MySQL индексы группируются" - лучше б они этого не делали...

The
07.02.2018
14:49:54
в табличке максимум 70к записей
думаю сервер не споткнется
тем более индексы есть

Alexey
07.02.2018
14:54:55

The
07.02.2018
15:10:09

Алексей
07.02.2018
16:34:19
``Народ можетт кто подсказать, почему автоинкримент глючно работает?
не всегда идет последовательно
что может быть? :(

Сергей
07.02.2018
16:36:13
Транзакции были откачены

Anton
07.02.2018
16:36:29
Ещё вариант: ON DUPLICATE KEY поднимает автоинкремент.

Алексей
07.02.2018
16:36:57
ON DUPLICATE KEY стоит, точно, не знал, спасибо

Anton
07.02.2018
16:37:56
там механика какая - сначала взял автоинкремент , потом проверка уникальности. Если проверка не прошла он естественно не откатывается, вдруг кто уже следующую себе забрал запись

Dmitry
07.02.2018
17:27:25
Yes, if it's local in most cases

Halexsandro
07.02.2018
17:46:54
Hello guys! I have a need that is to extract the information of which size of each database on my server. I got a query, but it brings me 2 data: information_schema and the table I really want.
SELECT table_schema 'TABLE_NAME', round(sum( data_length + index_length ) / 1024 / 1024) "Size in MB" FROM information_schema.TABLES GROUP BY table_schema like 'TABLE_NAME ;
Is the actual size only the basis that I use or should I consider the sum of both tables listed to know how much hard drive is being consumed?
Thank you!

Google

Alexey
07.02.2018
17:51:57

Halexsandro
07.02.2018
17:53:30

Илья
07.02.2018
18:10:56
всем привет. на собеседовании задали вопрос, до сих пор не понял, что хотели от меня услышать. "что самое страшное может нам показать план выполнения запроса sql?". может кто-то подсказать? )

Egor
07.02.2018
18:14:16
Рекурсию ?

Anton
07.02.2018
18:14:54
В восьмой версии ввели оную?
А так type=all наверное, да filesort)))))

Alexey
07.02.2018
18:19:51

Anton
07.02.2018
18:21:05
На самом деле, они просто хотели узнать, чего именно боишься ты))))

Alexey
07.02.2018
18:22:28

Anton
07.02.2018
18:23:04
@alexey_kopytov Кроме PREPARE ничего так и не придумал((((
но PREPARE - ещё та дрянь конечно...

Alexey
07.02.2018
18:23:17
а чем PREPARE помогает?

Anton
07.02.2018
18:23:46
я сначала собираю айдишники груп конкатом. А потом через PREPARE делаю запрос "IN ()"

Alexey
07.02.2018
18:24:05
ух, забористо

Anton
07.02.2018
18:24:20
Ну, это единственное, что я смог придумать(((

Alexey
07.02.2018
18:25:04
у меня времени было не особо. всё, что я увидел — это то, что в "правильном" тестовом запросе на самом деле используется full index scan (type=index), и вряд ли бы ты заходел увидеть такое в join-е
но в джойне используется ref access, который действительно использовал только первую keypart. а по-другому этот тип и не умеет
тебе на самом деле там нужен type=range. но заставить оптимизатор его использовать на тестовом примере у меня с разбегу не получилось

Anton
07.02.2018
18:28:16
вот у меня тоже range получился только варианттом с PREPARE.
Пока так сделал на интересующем запросе, будет время - ещё попробую подумать. Но так хотя бы работаетт

Google

Anton
07.02.2018
18:29:22
range, обе части в "used_key_parts" - всё что доктор прописал
но енкрасиво и лишний запрос

Alexey
07.02.2018
18:30:17
я попробую ещё поиграться. на другом примере range access в джойнах довольно легко было получить, почему здесь он упёрся в ref — пока не понимаю

Anton
07.02.2018
18:31:19
Я тоже ещё пытаюсь тему изучать. Оптимайзер_свитч весь перещёлкал, запрос как только не перестраивал. Ладно, надеюсь со временем найдётся более красивое решение. А пока - и так сойдёт?

Alex
07.02.2018
19:05:11
всем привет, а кто нить подскажет тут по настройке mysql ?
или тут только запросы обсуждатся?

Иван
07.02.2018
19:06:02
не только запросы


Alex
07.02.2018
19:06:49
мне нужно для нагруженного сервера сделать настройки. при том что база в реплике работает
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mariadb/mariadb-slow.log
long_query_time = 10
#log-queries-not-using-indexes
innodb_log_file_size=12M
tmp_table_size=50M
max_heap_table_size=50M
#query_cache_limit=20M
max_connections=100
innodb_buffer_pool_size = 100M
connect_timeout=3
join_buffer_size=2M
max_allowed_packet=10M
table_cache=1000
sort_buffer_size=256K
read_buffer_size=128K
read_rnd_buffer_size=4M
key_buffer=256M
#innodb_buffer_pool_size = 3G
local-infile=0
performance_schema = ON
innodb_log_file_size=12M
innodb_buffer_pool_instances=3
#max_connections = 600
max_user_connections=100
key_buffer_size = 512M
myisam_sort_buffer_size = 64M
#read_buffer_size = 1M
table_open_cache = 5000
thread_cache_size = 384
wait_timeout = 5
#connect_timeout = 10
#tmp_table_size = 256M
#max_heap_table_size = 128M
#max_allowed_packet = 64M
net_buffer_length = 16384
max_connect_errors = 10
concurrent_insert = 2
#read_rnd_buffer_size = 786432
bulk_insert_buffer_size = 8M
query_cache_limit = 5M
query_cache_size = 0
query_cache_type = 0
query_prealloc_size = 262144
query_alloc_block_size = 65535
transaction_alloc_block_size = 8192
transaction_prealloc_size = 4096
max_write_lock_count = 8
slow_query_log
log-error
external-locking=FALSE
open_files_limit=50000
вот такой конфиг - но постоянно падает коннект
Aborted connection 99877 to db: ошибка соедиениеяhost: 'localhost' (Got timeout reading communication packets)
соответсвенно отвалвается nginx с 502 ошибкой


Anton
07.02.2018
19:11:19
А ты уверен, что дело в сервере, а не в коннекторе или сети?

Alex
07.02.2018
19:11:30
на одном сервере все
локально

Anton
07.02.2018
19:11:49
это не показатель))))
А вообще, вотт например у перконы целая статья была, куда копнуть:
https://www.percona.com/blog/2016/05/16/mysql-got-an-error-reading-communication-packet-errors/
Понятно, что це не мария, но я не думаю, что будут большие различия в этом плане

Alex
07.02.2018
19:13:29
I strongly recommend changing the application logic to properly close connections at the end of an operation.
но программерам то не докажешь что нужно так делать

Google

Alex
07.02.2018
19:13:52
все ж умные нынче
я на самом деле уже много перерыл в интеренете
менял и так и сяк - попробовал тулзу в помощь по оптимизации
та что на гите

Anton
07.02.2018
19:14:59
поставь евент, который будет делать KILL всех соединений, которые будут висеть в слипе больше определённого промежутка времени, удиви программеров))))
У меня такой есть. Правда, пользую тока в крайннем случае ручным запуском)))) Ибо нефиг!

Alex
07.02.2018
19:16:49
Variables to adjust:
join_buffer_size (> 2.0M, or always use indexes with joins)
tmp_table_size (> 50M)
max_heap_table_size (> 50M)
innodb_buffer_pool_size (>= 484M) if possible.
innodb_log_file_size should be (=12M) if possible, so InnoDB total log files size equals to 25% of buffer pool size.
wsrep_slave_threads= Nb of Core CPU * 4
gcs.fc_limit= wsrep_slave_threads * 5
gcs.fc_limit= wsrep_slave_threads * 5
gcs.fc_factor=0.8
innodb_flush_log_at_trx_commit = 0
set up parameter wsrep_notify_cmd to be notify
set up parameter wsrep_sst_method to xtrabackup based parameter
вот такое выдает тюнер
было бы там соединений за несколько деясяток тыш, а так 20-100
в среднем

Alexey
07.02.2018
21:03:30

Anton
07.02.2018
21:04:21
Так может там БД на 50 метров и больше и не надо)))))

Alexey
07.02.2018
21:05:02
сказали "для нагруженного сервера". нет, ну разные нагруженные сервера бывают, я не спорю
кстати, вот средняя температура по больнице для постгреса: https://speakerdeck.com/def/blits-doklad-na-pgconf-dot-russia-2018
там даже всё более-менее понятно, но меня особенно впечатлило 240K TPS суммарно на 500 инстансов. это какие-то смех и слёзы

Anton
07.02.2018
21:08:50
Пол транзакции, ничё так)))))
Я надеюсь, имеются ввиду хотя бы транзакции, включающие в себя запись. Если эта сттатистика включаетт в себя и чисто читаюющие, то жизнь как-то не удалась у них

Alexey
07.02.2018
21:11:09
полтысячи, но это тоже ни о чём. я всегда подозревал, что весь этот наш напудренный хайлоад занимается фигнёй в среднем по больнице. вот это документальное подтверждение

Anton
07.02.2018
21:11:28
Средняя загрузка диска 50% - это же жесть и не хай-лоад ни разу.