1. Оптимизация вставки данных
1.1 Подготовка данных
Сначала создайте таблицу с оператором построения тестовой таблицы индекса FULLTEXT:
1.2 Оптимизация важных параметров
1.2.1 Буферный пул
Прежде чем вставлять данные, давайте сначала посмотрим на среду, в которой находится текущая база данных:
показать глобальные переменные, такие как 'innodb_buffer_pool_size'; #Общий размер буферного пула
показать глобальные переменные, такие как 'innodb_buffer_pool_instances'; #Количество пулов буферов
Видно, что буферный пул музыкальной библиотеки в тестовой среде составляет 128 МБ, а всего имеется 8 буферных пулов.
Буферный пул используется для преодоления разрыва между ЦП и дисковым вводом-выводом.При записи данных сначала измените страницы в буферном пуле (страницы являются наименьшей единицей управления механизма хранения InnoDB), а затем сбросьте их на диск по определенной частоты.Множественные пулы буферов могут уменьшить конкуренцию за ресурсы в базе данных и увеличить возможности одновременной обработки базы данных.Поэтому общий размер пула буферов и количество пулов буферов являются важными показателями, которые определяют производительность обработки базы данных. Здесь размер буферного пула может быть увеличен для повышения скорости вставки.Поскольку это общедоступная тестовая среда, здесь не вносятся никакие изменения.
1.2.2 innodb_flush_log_at_trx_commit и sync_binlog
innodb_flush_log_at_trx_commit : стратегия сброса журналов повторов на диск, по умолчанию 1, то есть каждый раз, когда транзакция фиксируется, она сбрасывается на диск. Это стратегия синхронизации с самым высоким коэффициентом безопасности, но когда вставляется большой объем данных, скорость вставки сильно снижается из-за частых операций дискового ввода-вывода.
sync_binlog: стратегия сброса двоичных журналов на диск, значение по умолчанию равно 0, то есть двоичные журналы не включены, но во многих архитектурах баз данных master-slave этот параметр больше 0. Включение этого параметра также сильно повлияет на скорость вставки.
1.3 Вставка данных
Напишите хранимую процедуру пакетной вставки:
Затем вызовите хранимую процедуру:
2. Полнотекстовый индекс
При запросе информации, содержащей поле 100008, используйте like для запроса:
Причина в том, что когда like запрашивает первые 10 элементов, он использует полное сканирование таблицы, и при поиске всех 10 элементов данные будут возвращены. Оглядываясь назад на хранимую процедуру в версии 1.3, мы видим, что частота попаданий в поле 100008 составляет около 33%, что эквивалентно возврату достаточного количества данных, когда полное сканирование таблицы достигает 30 записей.
Но при запросе элементов от 1 000 000 до 1 000 010 это происходит очень медленно из-за сканирования около 3 миллионов данных для получения набора результатов:
Чтобы проверить эту точку зрения, я вставил в таблицу t_song_info_test_test два фрагмента данных.
В это время 200008 появилось только дважды в данных 10 миллионов + 2. На этом этапе выполните оператор запроса:
3. Обратите внимание
3.1 Минимальная длина по умолчанию для полнотекстового поиска — 4
Поля длиной менее 4 не будут записаны в полнотекстовый поиск, и результаты не будут найдены.
3.2 Сегментация слов не является интеллектуальной
Полнотекстовый поиск основан на символе пробела или "," и других очевидных полях-разделителях для сегментации слов. Он не поддерживает сегментацию китайских слов, как elasticsearch, но, начиная с MySQL 5.7.6, встроенная InnoDB поддерживает пользовательскую длину сегментации слов для сегментации китайских слов, вы можете обратиться к [woohoo.brief.com/afraid/from48106149…] (руководство по полнотекстовому поиску на китайском языке MySQL 5.7).