powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Индексирование и огромное замедление выборки.
25 сообщений из 26, страница 1 из 2
Индексирование и огромное замедление выборки.
    #39952442
c01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c01
Гость
Приветствую, комрады.
Вчера столкнулся со странной проблемой:
Есть база данных, состоящая из идентификатора, города (text), набора числовых полей (в каких-то только 2 разных значения, в каких-то 3 (tiny int, small int), в одном поле может быть 10 000 000 разных значений - соответственно тип инт). + один столбец с длинным текстом.
Всего в базе 9 000 000 строк и весит она 1,4 Гб.

Выборка из такой базы по какому-нибудь полю (или по их совокупности) занимает порядка 10-20 сек (vps 1 ядро, 1гб ram)
Я хотел ускорить выборки путём добавления индекса.
Однако после добавления хотя бы одного индекса время выборки увеличивается до 20-40 минут. При этом я понимаю, что индекс не обязан обязательно ускорять работу, если выбран неправильно. Я специально создавал иднекс по одному только полю и по нему же делал выборку - результат ужасный - 20-40 минут.
Также создавал индекс на поле которое int и делал по нему order by - то же самое, индекс не только не ускоряет, но и замедляет выборку с 20 секунд до 40 минут. При этом наблюдается 100% загрузка ядра (50 процесс, 50 ввод/вывод).
Таблицы Inno DB.
Я думал, что дело в настройках mysql, но я уже там перепробовал всякие разные значения для всевозможных буферов, результат одинаков.
В чем может быть дело, ума не приложу. Есть какие-нибудь идеи?
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952449
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c01,

Показывайте DDL таблицы, текста запроса и его план.
А так же значение innodb_buffer_pool_size.
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952508
c01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c01
Гость
SELECT * FROM ms WHERE `type2` = "1" ORDER BY `count` DESC LIMIT 0, 100000

Сейчас индексов нет, только первичный ключ. Потому что с ними невозможно работать.
Пробовал для запроса выше ставить индекс на поле type2 только. Результат - 40 минут запрос.
Пробовал задавать только индекс для поля count. - то же самое.
Когда индексы убираешь - скорость возвращается к 20-40 секундам на запрос.

innodb_buffer_pool_size был сначала 128М. Потом поставил 256М, сейчас стоит 512М - разницы никакой. Точнее есть незначительная разница без индексов. При использовании хотя бы одного индекса - время более 20 минут сразу.


CREATE TABLE `ms` (
`g_id` int(11) NOT NULL,
`name` text NOT NULL,
`city` text NOT NULL,
`count` int(11) NOT NULL,
`type1` text NOT NULL,
`type2` smallint(6) NOT NULL,
`url` text NOT NULL,
`type3` tinyint(4) NOT NULL,
`type4` tinyint(4) NOT NULL,
`type5` tinyint(4) NOT NULL,
`contacts` text NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Индексы сохранённых таблиц
--

--
-- Индексы таблицы `ms`
--
ALTER TABLE `ms`
ADD PRIMARY KEY (`g_id`);
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952522
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c01,

В поле type2 очень мало значений?
Тогда индекс по нему для выборки не поможет. Оптимизатор не знает статистики и слишком оптимистично смотрит на этот индекс.
По идее, если сделать ANALYZE TABLE этой таблице, то статистика должна рассчитаться и оптимизатор должен понять, что от этого индекса толку нет.

Если цель - ускорить именно этот запрос, то можно попробовать индекс (type2, count)
С последующим ANALYZE TABLE, конечно.
Но не факт, что поможет.
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952546
c01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c01
Гость
miksoft,

да, там значений мало. Я предполагал, что индекс может не помочь, но я никак не ждал ухудшения производительности в 50 раз...
Такое ощущение, что у меня не прописан в конфиге какой-нибудь буфер, который работает с индексами и для них тупо нет памяти. Хотя вроде как я читал, что для inno db всё решает этот самый innodb_buffer_pool_size.
Но должна же быть какая-то причина.
В принципе, я может быть вообще оставил бы только один индекс - по полю count, упорядоченный по desc, потому что у меня ORDER BY `count` DESC LIMIT 0, 100000 - в каждом запросе. А остальное может меняться, уловие where может быть разным.
И значений в count много. Так что индекс должен был бы помочь, но там точно такая же ситуация - только я его устанавливаю, запрос длится полчаса.....
Да, кстати, когда индексы еще были, я делал EXPLAIN - там всё было "нормально" - количество рядов уменьшалось, индекс типа использовался и все такое.... Да только это только в EXPLAINE все было красиво.....
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952569
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c01
Такое ощущение, что у меня не прописан в конфиге какой-нибудь буфер, который работает с индексами и для них тупо нет памяти.
Нет, это вопрос алгоритмов.
В ряде случаев быстрее прочитать всю таблицу и отфильтровать/отсортировать ее, нежели бежать по индексу, читать записи по одной штучке из таблицы (а это отдельная операция дискового чтения, и в случае HDD еще и ожидание диска).
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952573
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таблица 1.4Г
Может таблица и влезает в память каким то образом, а с индексом уже нет (индекс у InnoDB в том же файле. *.ibd)
Идет своп диска. Если не SSD, то это скорость 12-15Мб/сек.
чисто ради экперимента - 1гб ram надо увеличить
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952592
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov
чисто ради экперимента - 1гб ram надо увеличить
В идеале - да, надо увеличивать, чтобы в innodb_buffer_pool_size влезли и все таблицы, и все индексы.
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952671
c01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c01
Гость
Alex_Ustinov,

Я пробовал эту таблицу наращивать до 6 ГБ. И тогда без индексов на той же ВПСке она со скрипом но работала. Запросы шли по 2 минуты, но они выполнялись. Естественно она не влезала, даже свопа столько нет, чтобы засунуть туда ее всю.
Но вот таблица на 1.4 с индексом весит где-то 1.7 и время запроса 40 минут, тут явно не только в памяти дело.

Не могу разобраться, в чем причина, но мне кажется это очень подозрительным. Я даже готов создать какую-нибудь рандомную таблицу, проиндексировать её и попробовать - чисто ради эксперимента. Но нужно сделать идеальный вариант, когда индекс просто обязан работать. В этом случае, если у меня будет такая же картина - с ухудшением произвоительности - значит дело таки в сервере или в настройках буферов каких-то, вот только каких.....
Буду благодарен, если подскажете структуру таблицы и ндекса и запроса для эксперимента.
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952674
DYUMON
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анализ запроса сделай, он должен показать используется ли индекс в запросе, или просто перебор данных начинается.
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952675
DYUMON
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Покажи
SHOW VARIABLES LIKE '%buffer%' ;
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952676
c01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c01
Гость
DYUMON
Покажи
SHOW VARIABLES LIKE '%buffer%' ;
.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
 [code=sql]
bulk_insert_buffer_size
8388608
innodb_buffer_pool_chunk_size
134217728
innodb_buffer_pool_dump_at_shutdown
ON
innodb_buffer_pool_dump_now
OFF
innodb_buffer_pool_dump_pct
25
innodb_buffer_pool_filename
ib_buffer_pool
innodb_buffer_pool_instances
1
innodb_buffer_pool_load_abort
OFF
innodb_buffer_pool_load_at_startup
ON
innodb_buffer_pool_load_now
OFF
innodb_buffer_pool_size
268435456
innodb_change_buffer_max_size
25
innodb_change_buffering
all
innodb_log_buffer_size
16777216
innodb_sort_buffer_size
1048576
join_buffer_size
2097152
key_buffer_size
1048576
myisam_sort_buffer_size
8388608
net_buffer_length
16384
preload_buffer_size
32768
read_buffer_size
1048576
read_rnd_buffer_size
262144
sort_buffer_size
2097152
sql_buffer_result
OFF


...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952688
c01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c01
Гость
miksoft,

Кажется я начинаю понимать:
Сейчас скопировал всю базу на бесплатную впску на амазоне, там стоит веста с дефолтными настройками ну и ограничения всякие по времени ядра и т.п., но памяти тоже 1 Гб.
Так вот, сделал запрос - а он выполнился за одну секунду.
Я было обрадовался, однако как мне видится всё дело в LIMIT:
На базе без индексов я выполняю запрос с любым LIMIT за одинаковое количество времени - 20 сек, допустим.
А если есть индекс, то запросы с LIMIT 1 выполняются вообще мгновенно... и так до LIMIT 100 примерно. LIMIT 1000 выполняется уже все те же 20 сек.... А дальше....
короче индексы не ускоряют работу, если нужно выбирать много значений за раз...
Может быть я не прав, но пока такой вывод напрашивается.
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952806
DYUMON
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Настройки вроде норм.
единственное смущает это поле `city` text NOT NULL , размер этого поля 64кб по умолчанию( поправьте если ошибаюсь) , может его можно подрезать?
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952815
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DYUMON
Настройки вроде норм.
единственное смущает это поле `city` text NOT NULL , размер этого поля 64кб по умолчанию( поправьте если ошибаюсь) , может его можно подрезать?
Нет такого умолчания. Поле занимает места ровно столько, сколько нужно для фактических данных, плюс фиксированные накладные расходы (длина, указатель и т.п.)
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952818
DYUMON
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно на Explain SELECT * FROM ms WHERE `type2` = "1" ORDER BY `count` DESC LIMIT 0, 100000 взглянуть.
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952826
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c01,

надо пробовать с большим ОЗУ
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952855
c01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c01
Гость
Код: plaintext
1.
2.
3.
4.
+----+-------------+-------+------------+-------+---------------+---------------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key           | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | ms    | NULL       | index | NULL          | count         | 4       | NULL | 100000 |    10.00 | Using where |
+----+-------------+-------+------------+-------+---------------+---------------+---------+------+--------+----------+-------------+
Хех, как я и говорил, индекс используется, но когда нужно сделать выборку в 100 000 записей, быстрее получается без индекса.
Здесь я оставил только индекс count.
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952857
c01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c01
Гость
Alex_Ustinov,

куда это озу напихать?
исключительно в innodb_buffer_pool_size?
могу попробовать на тестовой ВПСке
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39952870
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c01,

пробуйте на тестовой с 3-4Г, если есть возможность
да, буфер ставить больше
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39953219
c01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c01
Гость
Короче, если кому интересно: потестировал я производительность mysql на другой концигурации.
Можете не соглашаться, но я сразу к выводам:
1. mysql может распараллеливать по ядрам только разные запросы. Один запрос будет выполняться на одном ядре.
2. директива innodb_flush_method = O_DIRECT - зло. Она замедляет работу (тогда как пишут много где, что она предотвращает кэширование того что уже закэшировано). - я её у себя удалил.
3. память в innodb_buffer_pool_size можно не выделять (и не писать этот пункт вообще) - если память есть, всё закэшируется в ОС.
4. вот этот конфиг я взял себе (на свою ВПСку) по итогам и уменьшил тем самым время запроса с 20с. до 13с.:
авторskip-external-locking
key_buffer_size = 16M
max_allowed_packet = 16M
table_open_cache = 1024
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
innodb_file_per_table

Этот конфиг предлагает Vesta CP на 2Гб конфигурацию. После того как я избавился от ненужных строк в своем и поставил этот, стало работать быстрее, даже на моем 1Гб, при этом памяти много не выделяется. По итогам нескольких дней работы, я подкручу потом некоторые параметры (чтобы было годно и для параллельной работы обычного сайта на CMS).

Ну вот. Больше уже похоже ничего улучшыть нельзя в моем случае.
Тестовая ВПСка показывала результат 7с (там где у меня сейчас 13, а было 20+) - скорее всего изза того что база полностью закэшировалась + там сам процессор случился пошустрее.
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39953240
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c01
mysql может распараллеливать по ядрам только разные запросы. Один запрос будет выполняться на одном ядре.
Это как бы очевидно, как мне казалось.
Параллельное выполнение одного запроса в несколько потоков - удел довольно крупных энтерпрайзных СУБД, к коим MySQL никак не относится.

c01
память в innodb_buffer_pool_size можно не выделять (и не писать этот пункт вообще)
Это невозможно. Даже есть параметр не указать вообще, то возьмется значение по-умолчанию, которое для MySQL 8 равно 128 МБайт - вполне неплохое значение для имеющихся 1 ГБайт оперативки.

c01
директива innodb_flush_method = O_DIRECT - зло.
Может быть, у вас innodb_flush_log_at_trx_commit =1 ?
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39953245
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторSELECT * FROM ms WHERE `type2` = "1" ORDER BY `count` DESC LIMIT 0, 100000
автор`type2` smallint(6) NOT NULL,

кстати, будет ли разница если в запросе `type2` = "1" заменить `type2` = 1 ?
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39953675
c01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c01
Гость
c01
директива innodb_flush_method = O_DIRECT - зло.
Может быть, у вас innodb_flush_log_at_trx_commit =1 ?
стояло 2. теперь убрал этот пункт, по умолчанию что - не знаю, но стало лучше.
...
Рейтинг: 0 / 0
Индексирование и огромное замедление выборки.
    #39953676
c01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c01
Гость
Дегтярев Евгений
авторSELECT * FROM ms WHERE `type2` = "1" ORDER BY `count` DESC LIMIT 0, 100000

автор`type2` smallint(6) NOT NULL,

кстати, будет ли разница если в запросе `type2` = "1" заменить `type2` = 1 ?
проверил, разницы в производительности никакой.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Индексирование и огромное замедление выборки.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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