fast-je
@fast-je
Пишу на php.

Как избавиться от простых медленных запросов?

Всем привет! Включил у себя лог медленных запросов в mysql и выводит выполнение.

# Time: 2020-03-12T12:27:02.829898Z
# User@Host: db_user[db_user] @ localhost []  Id: 1892069
# Query_time: 17.222467  Lock_time: 0.000035 Rows_sent: 0  Rows_examined: 1
SET timestamp=1584016022;
UPDATE `users_statistics` SET `profit_ref_1`=`profit_ref_1`+'0.0021' WHERE `id_user`='1410' LIMIT 1;


на `users_statistics`.`id_user` стоит primary key и записей порядка 70к я думаю, здесь не должно быть проблем.

Мне кажется проблема может быть в том что, какой-то другой запрос выполняется и тормозит выполнение всех остальных, вот тут видно что будто по цепочке и время выполнение у всех одно.

SELECT * FROM `still_youtube_ads_user` WHERE `idu` = '135498' and `status` != '0' ORDER BY `id` DESC;
# Time: 2020-03-12T12:27:02.829898Z
# User@Host: db_user[db_user] @ localhost []  Id: 1892069
# Query_time: 17.222467  Lock_time: 0.000035 Rows_sent: 0  Rows_examined: 1
SET timestamp=1584016022;
UPDATE `users_statistics` SET `profit_ref_1`=`profit_ref_1`+'0.0021' WHERE `id_user`='1410' LIMIT 1;
# Time: 2020-03-12T12:27:02.830099Z
# User@Host: db_user[db_user] @ localhost []  Id: 1892112
# Query_time: 17.205062  Lock_time: 0.000048 Rows_sent: 0  Rows_examined: 1
SET timestamp=1584016022;
UPDATE `users_statistics` SET `profit_ref_2`=`profit_ref_2`+'0.00098' WHERE `id_user`='1521' LIMIT 1;
# Time: 2020-03-12T12:27:02.834334Z
# User@Host: db_user[db_user] @ localhost []  Id: 1892725
# Query_time: 9.457391  Lock_time: 0.000061 Rows_sent: 0  Rows_examined: 1
SET timestamp=1584016022;
UPDATE `users_statistics` SET `profit_ref_1`=`profit_ref_1`+'0.00476' WHERE `id_user`='2087' LIMIT 1;
# Time: 2020-03-12T12:53:03.801421Z
# User@Host: db_user[db_user] @ localhost []  Id: 1990736
# Query_time: 1.091659  Lock_time: 0.000149 Rows_sent: 1  Rows_examined: 152662
SET timestamp=1584017583;
SELECT


ОЗУ на сервере 10 гб, все на одном сервере что сайт, что бд.
CPU

5e6a5aed18481979264476.png

my.cnf файл

[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
default-character-set = utf8
#default-character-set = utf8mb4

[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0

[mysqld]
local-infile=0
explicit_defaults_for_timestamp = 1
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
default_storage_engine=MyISAM
skip-external-locking

connect_timeout = 70
interactive_timeout = 70
wait_timeout = 70

key_buffer_size = 16M
join_buffer_size = 8M
max_connect_errors = 30
max_allowed_packet = 16M
#table_open_cache = 4096
thread_stack = 384K
thread_cache_size = 500
max_user_connections = 150
max_connections = 150
myisam_sort_buffer_size = 8M
net_buffer_length = 96K

query_cache_type = 1
query_cache_limit = 16M
query_cache_size = 1M

max_heap_table_size=48M
tmp_table_size=48M
sort_buffer_size = 8M
read_buffer_size = 8M
read_rnd_buffer_size = 8M

#net_read_timeout=500

#general_log_file = /var/log/mysql/mysql.log
#general_log = 1

#log slow queries
slow_query_log_file = /var/log/mysql/mysql-slow.log
slow_query_log = 1
long_query_time = 1

#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
log_error = /var/log/mysql/mysql_errornew.log
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name
#
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
innodb_buffer_pool_size = 3048M
innodb_thread_concurrency = 17
innodb_log_file_size = 128M
innodb_log_buffer_size = 32M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_lock_wait_timeout = 180
innodb_file_per_table = 1
innodb_buffer_pool_instances=3
character-set-server=utf8
collation-server=utf8_general_ci
init-connect="SET NAMES utf8"

#character-set-server = utf8mb4
#collation-server = utf8mb4_unicode_ci
#init-connect = "SET NAMES utf8mb4"

skip-character-set-client-handshake

[mysqldump]
quick
quote-names
max_allowed_packet = 64M
default-character-set = utf8
#default-character-set = utf8mb4

[mysql]
#no-auto-rehash # faster start of mysql but no tab completition
default-character-set = utf8
[isamchk]
#key_buffer=512M
#sort_buffer=512M
#read_buffer=512M
#write_buffer=512M

[myisamchk]
#key_buffer=512M
#sort_buffer=512M
#read_buffer=512M
#write_buffer=512M

[mysqlhotcopy]
interactive-timeout



Таблицы MyISAM и innoDB есть, но MyISAM больше.
users_statistics = innoDB
still_youtube_ads_user = MyISAM

Индекс используется

5e6a801be5b64940307158.png


В чем может быть проблема выполнение таких простых запросов ? Куда направить свой взор ?
Может конфиги неправильно настроены, либо код кривой.
Конфиги делал не я, так что сильно прошу не ругать.
  • Вопрос задан
  • 234 просмотра
Пригласить эксперта
Ответы на вопрос 2
@vitaly_il1
DevOps Consulting
1) а что в целом на сервере делается в смысле нагрузки? у вас есть график мониторинга?
2) могут быть проблемы с диском
3) советую запустить генератор отчетов по медленным запросам на логе за 1-2 дня - pt-query-digest или т.п.
4) а какого размера база? с разбивкой по innodb/myisam? если действительно myisam большие таблицы, то стоит увеличить key_buffer_size
Ответ написан
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Так посмотрите, используется-ли вообще индекс при выполнении UPDATE запроса:
EXPLAIN UPDATE `users_statistics` SET `profit_ref_1`=`profit_ref_1`+'0.0021' WHERE `id_user`='1410' LIMIT 1;

в PhpMyAdmin, например. Или в консоли.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы