множественная индексация с медленным запросом - PullRequest
0 голосов
/ 10 июня 2018

В следующем запросе я проиндексировал каждое поле, например:

  • menu.id
  • pricelist.menu_id
  • vendors.id
  • pricelist.vendor
  • orders.pricelist_id
  • pricelist.id
  • users.id
  • orders.user_id
  • orders.free
  • pricelist.menu_id.

Когда я запускаю приведенный ниже запрос, это занимает много времени, у нас 13 миллионов записей в таблице orders, а в другой таблице несколько тысяч.

SELECT
    `orders`.`itusername`,
    `orders`.`iturl`,
    `orders`.`error_message`,
    `orders`.`return` AS return1,
    `orders`.`coupon`,
    DATEDIFF( users.reseller_expiry, now( ) ) AS edays,
    `users`.`email`,
    `menu`.`menuname`,
    `orders`.`error_status`,
    `orders`.`auto_status`,
    `vendors`.`name`,
    `vendors`.`id` AS venderid,
    `pricelist`.`servicename`,
    `orders`.`email_order` AS paypal_order_email,
    `orders`.`user_id`,
    `orders`.`services_order`,
    `orders`.`created_dt`,
    `orders`.`id`,
    `orders`.`transaction_comment`,
    `orders`.`url`,
    `orders`.`requireviews`,
    `orders`.`youtubeviews`,
    `orders`.`total_views_completed`,
    `orders`.`aff`,
    `orders`.`is_package`,
    `orders`.`price`,
    `orders`.`order_from_site`,
    `orders`.`cost_per_unit_order`,
    `orders`.`service_name_order`,
    `orders`.`status`,
    `orders`.`start_api_date`,
    `orders`.`end_api_date`,
    `orders`.`allow_setting`,
    `orders`.`return2`,
    `users`.`balance` AS user_balance 
FROM
    ( `pricelist` )
    JOIN `menu` ON `menu`.`id` = `pricelist`.`menu_id`
    JOIN `vendors` ON `vendors`.`id` = `pricelist`.`vendor`
    JOIN `orders` ON `orders`.`pricelist_id` = `pricelist`.`id`
    JOIN `users` ON `users`.`id` = `orders`.`user_id` 
WHERE
    `orders`.`free` != 1 
    AND pricelist.menu_id = 3 
ORDER BY
    `orders`.`id` DESC 
    LIMIT 10.

.................................

1 Ответ

0 голосов
/ 11 июня 2018

Хитрость заключается в том, чтобы сделать LIMIT перед , бегая по 5 таблицам.

SELECT  ...
    FROM 
        ( SELECT  orders.pricelist_id AS id
            FROM  pricelist
            JOIN  `orders`  ON `orders`.`pricelist_id` = `pricelist`.`id`
            WHERE  `orders`.`free` != 1
              AND  pricelist.menu_id = 3
            ORDER BY  `orders`.`id` DESC
            LIMIT  10 
        ) AS x
    JOIN  `pricelist`  ON pricelist.id = x.id
    JOIN  `menu`       ON `menu`.`id` = `pricelist`.`menu_id`
    JOIN  `vendors`    ON `vendors`.`id` = `pricelist`.`vendor`
    JOIN  `orders`     ON `orders`.`pricelist_id` = x.`id`
    JOIN  `users`      ON `users`.`id` = `orders`.`user_id` 
    ORDER BY  `orders`.`id` DESC 

Есть неизвестное - есть таблицы 1: 1 или 1: многиеили много: 1 или много: много?При «неправильных» ответах вы получите более 10 строк, а дизайн имеет недостатки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...