#mysql
#mysql
Вопрос:
У меня следующий запрос. основными таблицами являются company_reports
and project_con_messages
с 770 000 и 1 040 000 записей соответственно. Когда я запускаю этот запрос, это занимает около 20 секунд, а когда я удаляю последнюю таблицу company_par_user_settings
, это занимает менее 0,5 секунды. company_par_user_settings
(краткое название: pus) содержит около 200 000 записей и предназначен для отображения пользовательских настроек для каждой company_partner
. в company_par_user_settings
таблице у нас есть составной уникальный индексный ключ partner_id
и user_id
поля. Я также удалил индекс и заменил его простыми индексами на partner_id
и user_id
, но, в конце концов, это не имело большого значения во времени выполнения.
SELECT *
FROM company_reports rep
LEFT JOIN system_users usr ON rep.user_id=usr.id
LEFT JOIN company_rep_subjects sbj ON rep.subject_id=sbj.id
INNER JOIN company_partners par ON rep.partner_id=par.id
LEFT JOIN project_con_messages mes ON rep.message_id=mes.id
LEFT JOIN company_par_user_settings pus ON par.id=pus.partner_id AND 1=pus.user_id
WHERE 1=1
ORDER BY rep.id DESC
LIMIT 0,50
Здесь ниже я добавил объяснение приведенного выше запроса:
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
| 1 | SIMPLE | rep | NULL | ALL | partner_id | NULL | NULL | NULL | 772236 | 100.00 | Using temporary; Using filesort |
| 1 | SIMPLE | par | NULL | eq_ref | PRIMARY | PRIMARY | 3 | portal_ebrahim.rep.partner_id | 1 | 100.00 | NULL |
| 1 | SIMPLE | usr | NULL | eq_ref | PRIMARY | PRIMARY | 2 | portal_ebrahim.rep.user_id | 1 | 100.00 | Using where |
| 1 | SIMPLE | sbj | NULL | eq_ref | PRIMARY | PRIMARY | 2 | portal_ebrahim.rep.subject_id | 1 | 100.00 | NULL |
| 1 | SIMPLE | mes | NULL | eq_ref | PRIMARY | PRIMARY | 4 | portal_ebrahim.rep.message_id | 1 | 100.00 | NULL |
| 1 | SIMPLE | pus | NULL | ALL | NULL | NULL | NULL | NULL | 191643 | 100.00 | Using where; Using join buffer (Block Nested Loop) |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
Я признателен, если кто-нибудь поможет мне с правильными индексами или любыми другими решениями, которые ускоряют выполнение запроса.
Редактировать:
Вот таблица показа для company_par_user_settings
CREATE TABLE `company_par_user_settings` (
`id` mediumint(9) NOT NULL AUTO_INCREMENT,
`partner_id` mediumint(8) unsigned NOT NULL,
`user_id` smallint(5) unsigned NOT NULL,
`access` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0-Not specified',
`access_category` tinyint(1) unsigned NOT NULL DEFAULT '0',
`notify` tinyint(1) unsigned NOT NULL DEFAULT '0',
`stars` tinyint(1) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `partner_id` (`partner_id`,`user_id`),
KEY `stars` (`stars`)
) ENGINE=MyISAM AUTO_INCREMENT=198729 DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci
Комментарии:
1. Можете ли вы добавить определение таблицы (вывод
show create table company_par_user_settings
), а также тип данных для par.id/rep.partner_id ?2. @Solarflare Все таблицы используют механизм хранения MyISAM. оба par.id и rep.partner_id — это средний размер (8), для которого я добавил показать таблицу создания
company_par_user_settings
в свой основной пост3. @Solarflare удивительно, что у меня такая же база данных на другом компьютере, и когда я использую тот же запрос, я получаю другой результат EXPLAIN. Я сравнил две базы данных, включая дизайн таблиц, индексы и механизмы хранения. Все они одинаковы, но результат по-прежнему отличается.