Ответы пользователя по тегу SQL
  • Как ускорить sql запрос?

    3vi1_0n3
    @3vi1_0n3
    Выглядит достаточно плохо, но, мне кажется, я понимаю, какая у вас структура данных в базе плюс-минус.
    Самый простой вариант оптимизации для начала:
    SELECT t1.sum_za_zakazy AS sum_za_zakazy,  t2 .......
    
    FROM ( SELECT COALESCE (sum(v2.meta_value),0) AS sum_za_zakazy
           FROM wp_posts
           JOIN wp_postmeta v1 ON (wp_posts.ID = v1.post_id)
           JOIN wp_postmeta v3 ON (wp_posts.ID = v3.post_id)
           JOIN wp_postmeta v2 ON (wp_posts.ID = v2.post_id)
    WHERE wp_posts.post_type='zakazy'
    AND wp_posts.post_status='publish'
    AND v1.meta_value = '%current_field|id_uchastnika%'
    AND v3.meta_value
        BETWEEN '%current_field|data_1%' AND '%current_field|data_2%'
    AND (
       (v1.meta_key = 'id_shvei_1'           AND v2.meta_key = 'summa_shvei_1'           AND v3.meta_key = 'shveia-1-data')
    OR (v1.meta_key = 'id_shvei_2'           AND v2.meta_key = 'summa_shvei_2'           AND v3.meta_key = 'shveia-2-data')
    OR (v1.meta_key = 'id_shvei_3'           AND v2.meta_key = 'summa_shvei_3'           AND v3.meta_key = 'shveia-3-data')
    OR (v1.meta_key = 'id_razborshhika_1'    AND v2.meta_key = 'summa_razborshhika_1'    AND v3.meta_key = 'razborshchik-1-data')
    OR (v1.meta_key = 'id_razborshhika_2'    AND v2.meta_key = 'summa_razborshhika_2'    AND v3.meta_key = 'razborshchik-2-data')
    OR (v1.meta_key = 'id_sborshhika_1'      AND v2.meta_key = 'summa_sborshhika_1'      AND v3.meta_key = 'sborshchik-1-data')
    OR (v1.meta_key = 'id_sborshhika_2'      AND v2.meta_key = 'summa_sborshhika_2'      AND v3.meta_key = 'sborshchik-2-data')
    OR (v1.meta_key = 'id_sborshhika_3'      AND v2.meta_key = 'summa_sborshhika_3'      AND v3.meta_key = 'sborshchik-3-data')
    OR (v1.meta_key = 'id_dostavki_v_czeh'   AND v2.meta_key = 'czena_dostavki_v_czeh'   AND v3.meta_key = 'data-zabora')
    OR (v1.meta_key = 'id_dostavki_iz_czeha' AND v2.meta_key = 'czena_dostavki_iz_czeha' AND v3.meta_key = 'data-dostavki')
    OR (v1.meta_key = 'id_menedzhera'        AND v2.meta_key = 'summa_menedzhera'        AND v3.meta_key = 'data-zakaza')
    )) t1
    
    CROSS JOIN( SELECT COALESCE (sum(v2.meta_value),0) AS ....... t2


    Так хотя бы более понятно.
    Все общие условия выносите в начало. Всё, что используется всегда, для всех комбинаций ключей.
    Я поменял порядок джоинов (v2 и v3), на случай, если планировщик не додумается, в каком порядке фильтровать, хотя я не уверен, что это будет проблемой, но планировщики не всегда работают умно, иногда надо подсказывать. По дефолту JOIN в MySQL, если правильно помню, INNER, поэтому в теории можно подрезать набор данных слева таким образом.
    Вот после этого попробуйте, сравните время запроса и результат с тем, что до, и потом используйте EXPLAIN <ваш запрос>. Есть вероятность, что внутренний SELECT выполняется для каждой записи.
    На поля wp_posts.post_type и wp_posts.post_status можно будет потом (при необходимости) сделать индексы, если их еще нет (можно комбинированный).
    На wp_postmeta.meta_key исходя из полученной картины можно будет сделать индекс, если его еще нет, как и на wp_postmeta.meta_value, хотя я бы ожидал, честно говоря, что они уже есть.
    Просто так индексы создавать не надо, только при необходимости.
    Ответ написан
    2 комментария
  • Почему невозможно перемещаться по командной строке?

    3vi1_0n3
    @3vi1_0n3
    Если отвечать на вопрос из заголовка, то потому, что исключили readline из сборки. Цитирую:
    GNU библиотека readline предназначена для создания однотипного
    пользовательского интерфейса в программах, использующих строковый
    ввод команд.
    Ответ написан
  • Дадите совет по построению БД?

    3vi1_0n3
    @3vi1_0n3
    Я бы сделал одну табличку такой структуры как ваши, но с одним дополнительным полем Status, в котором можно писать, куда, собственно, человек относится.
    Person(PersonId, FirstName, LastName, Sex, Online, City, Status)
    Ну, или если нужны исторические данные, то одна табличка, описывающая персону, а вторая - Дата, Статус, UserID. То есть, можно будеть описать сущности так:
    Person(PersonId, FirstName, LastName, Sex, Online, City)
    PersonId - первичный ключ (автоинкрементируемый)
    StatusChange(Id, PersonId, ChangeDate, ChangeValue)
    Id - первичный ключ, PersonId - foreign key
    Ну и, собственно, всё.
    Последний статус находится по максимальному значению Id, которое должно быть автоинкрементальным
    Ответ написан
    Комментировать
  • Google Doc - возможно ли дублирование файлов из 50 таблиц в 1?

    3vi1_0n3
    @3vi1_0n3
    Разве что вот так:
    =IMPORTRANGE("ключ-документа", "Лист1!A2:A12")
    Ключ документа берется из урла (https://docs.google.com/spreadsheets/d/ключ)
    Ответ написан