Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > innodb тормозят запросы по ключу


Автор: Fubu_By 31.7.2018, 11:35
есть простой запрос, который переодически тормозит при выборке по первичному ключу (поле `name` - varchar(255)), таблица небольшая 240.000 записей innodb
Код

# Query 7: 0.00 QPS, 0.02x concurrency, ID 0xEC24272948E20847 at byte 810024
# This item is included in the report because it matches --limit.
# Scores: V/M = 37.88
# Time range: 2018-07-25 01:54:34 to 2018-07-31 03:28:17
# Attribute    pct   total     min     max     avg     95%  stddev  median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count          3     935
# Exec time      3  12786s      1s    167s     14s     60s     23s      6s
# Lock time      0   346ms    17us    52ms   370us    49us     4ms    28us
# Rows sent      0     935       1       1       1       1       0       1
# Rows examine   0     935       1       1       1       1       0       1
# Query size     0 190.15k     206     210  208.25  202.40       0  202.40
# String:
# Databases    aviatickets
# Hosts        localhost
# Users        admin
# Query_time distribution
#   1us
#  10us
# 100us
#   1ms
#  10ms
# 100ms
#    1s  ################################################################
#  10s+  ###########################
# EXPLAIN /*!50100 PARTITIONS*/
SELECT * FROM `table` WHERE `name` = 'b61031' LIMIT 1\G


Может нужно в настройах самого mysql(5.5.57) подкрутить? вот my.cnf
Код


[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock

[mysqld_safe]
log-error=/var/log/mysql.log
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]

local-infile=0
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
skip-external-locking
tmp_table_size      = 2G
max_heap_table_size = 2G
bind-address            = localhost

key_buffer              = 16M
max_allowed_packet      = 100M
thread_stack            = 192K
thread_cache_size       = 8

myisam-recover         = BACKUP
max_connections        = 1000

query_cache_limit       = 1M
query_cache_size        = 16M

log_error = /var/log/mysql/error.log

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



expire_logs_days        = 10
max_binlog_size         = 100M
bind-address = 138.201.28.33





[mysqldump]
quick
quote-names
max_allowed_packet      = 16M



[isamchk]
key_buffer              = 16M




Автор: Akina 1.8.2018, 12:53
Покажите DDL таблицы. И поясните, зачем вам одна СЛУЧАЙНАЯ запись из всех возможных с заданным значением поля.

Автор: Fubu_By 3.8.2018, 08:56
Akina, это не случайная запись, а поднятие конкретной записи из БД. name - primary, потому что по этому полю происходит идентификатция данных во внешнем сервисе и запись должна быть уникальной

Код

create table flights
(
    name varchar(255) not null,
    origin_airport_id smallint(5) unsigned not null,
    destination_airport_id smallint(5) unsigned not null,се
    airline_id smallint(5) unsigned not null,
    updated_at timestamp default CURRENT_TIMESTAMP not null,
    constraint flights_number_name_uindex
        unique (name),
    constraint flights_airlines_id_fk
        foreign key (airline_id) references airlines (id)
            on update cascade on delete cascade,
    constraint flights_number_destination_airport_id_fk
        foreign key (destination_airport_id) references airports (id)
            on update cascade on delete cascade,
    constraint origin_airports_id_fk
        foreign key (origin_airport_id) references airports (id)
            on update cascade on delete cascade
)
;

create index airline_id
    on flights (airline_id)
;

create index destination_airport_id
    on flights (destination_airport_id)
;

create index origin_airport_id_destination_airport_id
    on flights (origin_airport_id, destination_airport_id)
;

alter table flights
    add primary key (name)
;

Автор: Akina 3.8.2018, 09:49
Цитата(Fubu_By @  3.8.2018,  09:56 Найти цитируемый пост)
это не случайная запись, а поднятие конкретной записи из БД. name - primary

Ну DDL Вы изначально-то не показали... а там поди догадайся. 
А коли так - то нафига, позвольте узнать, LIMIT 1?

Автор: Fubu_By 4.8.2018, 22:01
Akina, это фреймворк подставляет, да и чтобы на первой найденой записи остановился и бьольше не искал. Но я не думаю, что проблема в этом...

Автор: Akina 5.8.2018, 16:31
Цитата(Fubu_By @  4.8.2018,  23:01 Найти цитируемый пост)
чтобы на первой найденой записи остановился и бьольше не искал

 smile  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)