Страница 1 из 1

Большая БД и поиск по ней

Добавлено: 29 мар 2021, 10:29
UFOCorp
Всем привет!

Использую OpenServer 5.3.7 с PHP 7.4 и MySQL 8.0 на сервере Intel Core i3-2100 (3.1 ГГц), 4 ГБ ОЗУ без SSD, на HDD. Установлен сайт на Wordpress, в котором содержится более 60 тысяч опубликованных записей. Засунуты они туда автопостингом скриптами. Каждая запись - это около 5-10 страниц А4 текста. У каждой записи установлена своя рубрика. Меток гораздо меньше - около семи штук, распределены равномерно. Это для описания масштаба загрузки базы. У некоторых записей много ревизий, таким образом в базе таблица с постами (wp_posts) имеет около 120 тысяч строк. MySQL сайта работает в InnoDB режиме, что кажется лучше сказывается на скорости. Объем данной БД около 4.1 ГБ.

Но есть проблема. Часто при первом обращении к поиску сайта (с конкретным запросом) выгрузка результатов может занять минут 20. Второй и последующие поиски происходят за секунды. Вероятно, первый поиск требует выгрузки базы в файл подкачки? MySQL постоянно сидит в ОЗУ и занимает там 800 МБ, 1500 МБ (чаще всего) или даже 2000-2200 МБ.

Конфиг mysql вот:
[client]

port		                    = %mysqlport%
character_sets_dir              = "%dprogdir%\\modules\\database\\%mysql_driver%\\share\\charsets"

[mysql]

no-auto-rehash
no-beep
character_sets_dir              = "%dprogdir%\\modules\\database\\%mysql_driver%\\share\\charsets"

[mysqld]

# Required Settings

basedir                         = "%dprogdir%\\modules\\database\\%mysql_driver%"
bind-address                    = %ip%
character_sets_dir              = "%dprogdir%\\modules\\database\\%mysql_driver%\\share\\charsets"
character_set_server            = utf8mb4
collation_server                = utf8mb4_unicode_ci
datadir                         = "%dprogdir%\\userdata\\%mysql_driver%"
default_authentication_plugin   = mysql_native_password
default_storage_engine          = MyISAM
explicit_defaults_for_timestamp = 1
ft_min_word_len                 = 3
local_infile                    = 0
lower_case_table_names          = 1
max_allowed_packet              = 3072M
mysqlx                          = 0
pid_file                        = "%dprogdir%\\userdata\\temp\\mysql.pid"
port                            = %mysqlport%
secure-file-priv                = "%dprogdir%\\userdata\\php_upload"
#skip_name_resolve              = 1
ssl                             = 0
tmpdir                          = "%dprogdir%\\userdata\\temp"

# Buffer Settings

bulk_insert_buffer_size         = 256M
join_buffer_size                = 256M
read_buffer_size                = 128M
read_rnd_buffer_size            = 128M
sort_buffer_size                = 256M

# Connection Settings

max_connections                 = 64
max_connect_errors              = 32
back_log                        = 128
thread_cache_size               = 64
interactive_timeout             = 180
wait_timeout                    = 180

# InnoDB Settings

innodb_adaptive_hash_index      = 0
innodb_buffer_pool_instances    = 1
innodb_buffer_pool_size         = 3072M
innodb_data_file_path           = ibdata1:10M:autoextend
innodb_data_home_dir            = "%dprogdir%\\userdata\\%mysql_driver%"
innodb_file_per_table           = 1
#innodb_force_recovery          = 1
innodb_log_file_size            = 64M
innodb_read_io_threads          = 8
#innodb_thread_concurrency      = 4
innodb_write_io_threads         = 8
innodb_flush_log_at_trx_commit  = 0

# Logging

%log%general_log                = 1
%log%general_log_file           = "%dprogdir%\\userdata\\logs\\%mysql_driver%_queries.log"
log_error                       = "%dprogdir%\\userdata\\logs\\%mysql_driver%_error.log"
skip-log-bin
#log_queries_not_using_indexes  = 1
#long_query_time                = 5
#slow_query_log                 = 1
#slow_query_log_file            = "%dprogdir%\\userdata\\logs\\%mysql_driver%_slow.log"

# MyISAM Settings

key_buffer_size                 = 256M
myisam_max_sort_file_size       = 256M
myisam_recover_options          = backup,force

# Table Settings

table_definition_cache          = 50000
table_open_cache                = 50000
open_files_limit                = 60000
max_heap_table_size             = 256M
tmp_table_size                  = 256M

# Set the SQL mode to strict
sql-mode = "ALLOW_INVALID_DATES"

[mysqldump]

quick
quote_names
max_allowed_packet              = 1024M

[myisamchk]

key_buffer_size                 = 256M
sort_buffer_size                = 256M
read_buffer                     = 16M
write_buffer                    = 16M

[mysqlhotcopy]

interactive-timeout

[mysqld_safe]

open_files_limit                = 60000
Вопрос: как можно ускорить работу базы для первого поиска? База в основном статичная, запись данных происходит пакетно по 200-1000 записей. И, возможно, даже запись новых данных влияет на переиндексирование БД, но речь идет даже о базе, к которой никак не обращались, просто сервер работал несколько часов в холостую, и вот дали первый поисковый запрос - он будет выполнятся несколько минут. Может можно что-то в Windows 7 настроить с подкачкой?

Re: Большая БД и поиск по ней

Добавлено: 30 мар 2021, 00:25
SagePointer
Включаете лог медленных запросов и смотрите, какой запрос зажирает столько времени. Далее - explain этого запроса и оптимизация, если возможно. Подозреваю, у вас фулскан по всем таблицам, никакими индексами там и не пахнет.