Как найти правильные индексы для нескольких объединенных таблиц

#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. Я сравнил две базы данных, включая дизайн таблиц, индексы и механизмы хранения. Все они одинаковы, но результат по-прежнему отличается.