Большая база данных php-mysql: очень медленный запрос соединения [duplicate]

Компиляция программы на C ++ выполняется в несколько этапов, как указано в 2.2 (кредиты для Кейта Томпсона для ссылки) :

Превалирование среди правил синтаксиса

  1. Физические символы исходного файла сопоставляются в соответствии с реализацией в соответствии с базовым набором символов источника (ввод символов новой строки для индикаторов конца строки) при необходимости. [SNIP]
  2. Каждый экземпляр символа обратной косой черты (\), за которым сразу следует символ новой строки, удаляется, сплайсируя физические исходные строки для формирования логических строк источника. [SNIP]
  3. Исходный файл разбивается на токены предварительной обработки (2.5) и последовательности символов пробела (включая комментарии). [SNIP]
  4. Выполнены предпроцессорные директивы, макро-вызовы разворачиваются и выполняются операторные выражения _Pragma. [SNIP]
  5. Каждый элемент набора символов в символьном литерале или строковый литерал, а также каждая escape-последовательность и универсальное имя-символа в символьном литерале или не- -raw строковый литерал, преобразуется в соответствующий член набора символов выполнения; [SNIP]
  6. Соединительные маркеры литералов строки объединены.
  7. Символы пробела, разделяющие токены, уже не являются значимыми. Каждый токен предварительной обработки преобразуется в токен. (2.7). Результирующие маркеры синтаксически и семантически анализируются и переводятся как единица перевода. [SNIP]
  8. Устанавливаемые единицы перевода и единицы экземпляра объединяются следующим образом: [SNIP]
  9. Все ссылки на внешние сущности решена. Компоненты библиотеки связаны для удовлетворения внешних ссылок на объекты, не определенные в текущем переводе. Весь такой переводчик выводится в образ программы, который содержит информацию, необходимую для выполнения в среде выполнения. (акцент мой)

[footnote] Реализации должны вести себя так, как если бы эти отдельные фазы происходили, хотя на практике различные фазы могли быть свернуты вместе.

Указанные ошибки возникают на этом последнем этапе компиляции, чаще всего называемом связыванием. Это в основном означает, что вы собрали кучу файлов реализации в объектные файлы или библиотеки, и теперь вы хотите заставить их работать вместе.

Скажите, что вы определили символ a в a.cpp. Теперь b.cpp объявил этот символ и использовал его. Перед связыванием он просто предполагает, что этот символ был определен где-то , но он пока не заботится о том, где. Фаза связывания отвечает за поиск символа и правильную привязку его к b.cpp (ну, собственно, к объекту или библиотеке, которая его использует).

Если вы используете Microsoft Visual Studio, вы будете см., что проекты генерируют файлы .lib. Они содержат таблицу экспортированных символов и таблицу импортированных символов. Импортированные символы разрешены против библиотек, на которые вы ссылаетесь, и экспортированные символы предоставляются для библиотек, которые используют этот .lib (если есть).

Подобные механизмы существуют для других компиляторов / платформ.

Общие сообщения об ошибках: error LNK2001, error LNK1120, error LNK2019 для Microsoft Visual Studio и undefined reference to symbolName для GCC.

Код:

struct X
{
   virtual void foo();
};
struct Y : X
{
   void foo() {}
};
struct A
{
   virtual ~A() = 0;
};
struct B: A
{
   virtual ~B(){}
};
extern int x;
void foo();
int main()
{
   x = 0;
   foo();
   Y y;
   B b;
}

генерирует следующие ошибки с GCC:

/home/AbiSfw/ccvvuHoX.o: In function `main':
prog.cpp:(.text+0x10): undefined reference to `x'
prog.cpp:(.text+0x19): undefined reference to `foo()'
prog.cpp:(.text+0x2d): undefined reference to `A::~A()'
/home/AbiSfw/ccvvuHoX.o: In function `B::~B()':
prog.cpp:(.text._ZN1BD1Ev[B::~B()]+0xb): undefined reference to `A::~A()'
/home/AbiSfw/ccvvuHoX.o: In function `B::~B()':
prog.cpp:(.text._ZN1BD0Ev[B::~B()]+0x12): undefined reference to `A::~A()'
/home/AbiSfw/ccvvuHoX.o:(.rodata._ZTI1Y[typeinfo for Y]+0x8): undefined reference to `typeinfo for X'
/home/AbiSfw/ccvvuHoX.o:(.rodata._ZTI1B[typeinfo for B]+0x8): undefined reference to `typeinfo for A'
collect2: ld returned 1 exit status

и аналогичные ошибки с Microsoft Visual Studio:

1>test2.obj : error LNK2001: unresolved external symbol "void __cdecl foo(void)" (?foo@@YAXXZ)
1>test2.obj : error LNK2001: unresolved external symbol "int x" (?x@@3HA)
1>test2.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall A::~A(void)" (??1A@@UAE@XZ)
1>test2.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall X::foo(void)" (?foo@X@@UAEXXZ)
1>...\test2.exe : fatal error LNK1120: 4 unresolved externals

. Общие причины включают в себя:

16
задан DoNotArrestMe 16 January 2014 в 11:54
поделиться

7 ответов

Ваша проблема с производительностью, скорее всего, вызвана соединением с таблицей «term_taxonomy». Кажется, что все другие соединения используют первичный ключ (где у вас есть вероятные рабочие индексы). Поэтому мое предложение состоит в том, чтобы добавить составной индекс в term_taxonomy_id и term_id (или если вы должны: таксономия). Например:

CREATE UNIQUE INDEX idx_term_taxonomy_id_taxonomy
ON term_taxonomy( term_taxonomy_id, taxonomy);

Надеюсь, это вам поможет.

9
ответ дан carleson 26 August 2018 в 14:09
поделиться

Уверьте, что все столбцы, на которых есть условные утверждения «ON», есть, должны быть проиндексированы. Это значительно улучшит скорость.

1
ответ дан akkig 26 August 2018 в 14:09
поделиться

METADATA_TABLE и TERM_RELATIONSHIP_TABLE не имеют прокси-ключа. Когда в этих таблицах есть огромные записи, ваша производительность запросов будет удалена.

Контрольные точки для повышения производительности.

  1. Все таблицы должны иметь первичный ключ. Это связано с тем, что строки в таблице будут физически отсортированы.
  2. Для маленьких и запросов, содержащих несколько таблиц, содержащих первичный ключ в таблице, будет достаточно. Если вы по-прежнему хотите повысить производительность, создайте некластеризованный индекс для столбцов, например поле * object_Id таблицы term_relationships *. Некластеризованный индекс должен быть создан для тех столбцов в таблице, которые участвуют в операции объединения.

Однако следует отметить, что некластеризованный индекс должен быть очень меньше на тех таблицах, где происходит множественная вставка и обновления. Это не простой вопрос, на который нельзя ответить только в зависимости от времени выполнения. Существуют и другие факторы, которые влияют на ответ, особенно если среда, в которой выполняется хранимая процедура, в значительной степени является транзакционной.

Здесь вы можете найти

0
ответ дан gokul 26 August 2018 в 14:09
поделиться
    Declare @query as NVARCHAR(MAX)
    set @query = ('SELECT 
    products.id,
    products.name,
    price.value AS price,
    sku.value AS sku,
    size.name AS size
    FROM products
    INNER JOIN metadata AS price ON products.id = price.product_id AND price.meta_key = price
    INNER JOIN metadata AS sku ON products.id = sku.product_id AND sku.meta_key = sku
    INNER JOIN term_relationships AS tr ON products.id = tr.object_id
    INNER JOIN term_taxonomy AS tt
    ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy = size
    INNER JOIN terms AS size
    ON tt.term_id = size.term_id
    into #t')

    exec(@query);
    select * from #t

Надеюсь, что вышеупомянутый способ уменьшит использование времени или создаст временную таблицу со всеми выбранными вами полями и обновит временную таблицу, присоединившись к временной таблице ко всем другим таблицам, также может быть эффективным, хорошо я не уверен в этом, но даже я жду вашего результата, поскольку ваш вопрос кажется интересным

0
ответ дан JB9 26 August 2018 в 14:09
поделиться

Я бы предложил те:

  • Подумайте о сокращении этих объединений с уровня бизнеса;
  • Если это невозможно сделать из «верхнего» (бизнес-уровня) и данных не для реального времени, я бы предложил подготовить таблицу памяти (я знаю, что решение не идеально). И / / g1]

По моему опыту:

  • «joins» - это убийца для производительности, тем больше ваши данные, больше боли вы почувствуете;
  • Попытайтесь избавиться от объединений, а не пытаться улучшить производительность запросов, сохраняя соединения, если только вам это не нужно. Обычно я попытаюсь исправить эти проблемы с «top» до «bottom»
  • Последнее предложение - если все выше не работает.

(Простите, я не предлагал решение для улучшения производительности вашего запроса.)

0
ответ дан Joshua 26 August 2018 в 14:09
поделиться

Попробуйте следующее:

SELECT p.id, p.name, MAX(CASE m.meta_key WHEN 'price' THEN m.value ELSE '' END) AS price, 
       MAX(CASE m.meta_key WHEN 'sku' THEN m.value ELSE '' END) AS sku, s.name AS size
FROM products p 
INNER JOIN `metadata` AS m ON p.id = m.product_id  
INNER JOIN `term_relationships` AS tr ON p.id = tr.object_id 
INNER JOIN `term_taxonomy` AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy = 'size'
INNER JOIN `terms` AS s ON tt.term_id = s.term_id
GROUP BY p.id;

Если вы все еще находите, что ваш запрос медленный, добавьте [мой запрос], чтобы выяснить, какие столбцы нужны INDEX.

0
ответ дан Saharsh Shah 26 August 2018 в 14:09
поделиться

Нижеприведенный скрипт отформатирован в соответствии с правилами SQL Server. Вы можете изменить это в соответствии с правилами MySQL и дать ему попробовать -

SELECT 
  P.id,
  P.name,
  PIVOT_METADATA.price,
  PIVOT_METADATA.sku,
  size.name AS size
FROM products P (NOLOCK)

INNER JOIN term_relationships AS tr (NOLOCK)
    ON P.id = tr.object_id

INNER JOIN term_taxonomy AS tt (NOLOCK)
    ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy = 'size'

INNER JOIN terms AS size (NOLOCK)
    ON tt.term_id = size.term_id

INNER JOIN METADATA (NOLOCK)
    PIVOT
    (
        MAX(value)
        FOR [meta_key] IN (price,sku)
    )AS PIVOT_METADATA
    ON P.id = PIVOT_METADATA.product_id

. Я считаю, что это узкое место в вашем запросе - вы присоединяются к метаданным 2 раза. Поскольку в ваших таблицах есть отношения «один-ко-многим», метаданные 2-join не пострадают, но после этого, когда вы присоединяетесь к большему количеству таблиц, количество строк из-за увеличения отношения «один ко многим» - и, следовательно, падение производительности .

То, что я пытался достичь - я убеждаюсь, что как можно больше отношений 1 к 1 выполняются. Для этого я сделал Pivot по метаданным и сделал цену и amp; sku как столбцы. Теперь мой идентификатор продукта должен иметь только одну строку в метаданных. alos, я убедился, что присоединяюсь к этому пикоту в самом конце.

Попробуйте. Пожалуйста, поделитесь ожидаемой производительностью, количеством записей у вас есть & amp; также, какую производительность вы получаете с моим asnwer.

0
ответ дан Suyash Khandwe 26 August 2018 в 14:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: