Лучший подход для объединения нескольких таблиц MySQL в PHP?

Я разрабатываю систему, которая генерирует идентификаторы для всех пользователей, посещающих мой веб-сайт. Если пользователь создает учетную запись, подает заявку на кредит, покупает продукты и т. д., Он связывает информацию о пользователе с этим идентификатором в нескольких таблицах базы данных. Моя проблема в том, что объединение всей информации занимает много времени, поскольку на данный момент у нас более 60 000 тысяч записей. Ранее я создал VIEW, который полностью убил время производительности (до 3 минут), поэтому я решил вместо этого создать запрос для извлечения данных и объединить непустые поля с PHP, что в сумме дало 10-15 секунд, используя также разбиение на страницы. Я бы хотел, чтобы он улучшил его, если это возможно. Какие-либо предложения?

    SELECT DISTINCT
    u.user_id,
    u.operating_system_name AS os,
    u.browser_name AS browser,
    u.ip_address,
    u.hardware_type AS hardware,
    u.city AS city,
    u.state AS state,
    u.country AS country,
    u.date AS date,

    m.id_member AS member,
    s.id_supplier AS supplier,
    c.id_entry AS credit,
    p.id_partner AS partner,
    cu.employee_ID AS careersus,
    cm.empleado_ID AS careersmx,
    o.id_order     AS orderid,

    o.recipient_name AS fn_o,
    m.first_name AS fn_m,
    c.first_name AS fn_c,
    p.first_name AS fn_p,
    s.contact_first_name AS fn_s,
    cu.firstname AS fn_cu,
    cm.nombre AS fn_cm,

    o.last_name AS ln_o,
    m.last_name AS ln_m,
    c.last_name AS ln_c,
    p.last_name AS ln_p,
    s.contact_last_name AS ln_s,
    cu.lastname AS ln_cu,
    cm.apellido AS ln_cm

    FROM tb_users_ids AS u 
    LEFT JOIN tb_orders AS o ON u.user_id = o.user_id
    LEFT JOIN tb_members AS m ON u.user_id = m.user_id
    LEFT JOIN financing AS c ON c.user_id = u.user_id
    LEFT JOIN tb_partners AS p ON p.user_id = u.user_id
    LEFT JOIN suppliers AS s ON s.user_id = u.user_id
    LEFT JOIN tb_careers_us AS cu ON cu.user_id = u.user_id
    LEFT JOIN tb_careers_mx AS cm ON cm.user_id = u.user_id
    WHERE u.user_id<>''
    ORDER BY u.date DESC
    LIMIT ".$offset.", ".$rowsperpage;

Сделаны ли user_id в таблицах индексом? Это имеет большое значение

Lucky Murari 26.10.2018 20:20

@LuckyMurari нет, единственная таблица с индексом user_id - это tb_users_ids

Lilith Deficiency 26.10.2018 20:21

Мы можем проиллюстрировать проблему и решение, используя вдвое меньше таблиц, некоторые образцы данных и желаемый результат. Но главное - это индексы. Имея это в виду, см. Почему я должен предоставлять MCVE для того, что мне кажется очень простым SQL-запросом

Strawberry 26.10.2018 20:22

Время запроса на 100% связано с вашими индексами. Исправьте их, и у вас могут быть миллионы строк, и вы не увидите ничего> 100 мс. Вам следует либо опубликовать свою полную схему (только базу данных, а не данные), либо подумать о том, чтобы нанять кого-нибудь для консультации и исправления данных.

ugh StackExchange 26.10.2018 20:25

ДА, ЭТО БЫЛО ОТНОСИТСЯ К ИНДЕКСАМ, БОЛЬШОЕ СПАСИБО: D

Lilith Deficiency 26.10.2018 20:27

@LilithDeficiency. Поскольку это решило вашу проблему, не могли бы вы отметить мой ответ как принятый?

Lucky Murari 26.10.2018 20:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
6
45
2

Ответы 2

Вы должны создать индексы для всех сравниваемых полей. Итак, если ваш запрос похож на table1.user_id = table2.user_id, определите индекс для user_id в ваших таблицах table1 и table2. Делайте это за всеми столами.

Тогда это будет очень-очень быстро.

Пожалуйста, сделайте user_id индексом для всех ваших таблиц. Это сделает ваш запрос намного быстрее

Другие вопросы по теме