3

このSQLクエリを高速化する方法を教えてください。

SELECT pa.*
FROM ParametrickeVyhladavanie pa, 
     (SELECT p.*
     FROM produkty p
     WHERE p.KATEGORIA IN ('$categoryArray')) produkt
WHERE produkt.ATTRIBUTE_CODE LIKE CONCAT('%', pa.code, '%')
AND produkt.ATTRIBUTE_VALUE LIKE CONCAT('%', pa.ValueCode, '%')
GROUP BY pa.code

インデックス: pa.code、pa.ValueCode、p.ATTRIBUTE_CODE、p.ATTRIBUTE_VALUE

行 0 ~ 25 を表示しています (合計 26 行、クエリに20.4995 秒かかりました)

編集 実際のコード:

SELECT pa.*
FROM ParametrickeVyhladavanie pa
WHERE EXISTS
(
   SELECT 1 FROM produkty p
   JOIN 
   PRODUCT_INFO AS pi
   ON p.ProId = pi.ProduktID
   AND p.KATEGORIA IN ('Mobily'))

AND pi.ATTRIBUTE_CODE = pa.AttributeCode
AND pi.ATTRIBUTE_VALUE = pa.ValueCode
GROUP BY pa.code

このコードはエラー#1054 - Unknown column 'pi.ATTRIBUTE_CODE' in 'where clause' The pi.table working only between(と を示しています)

編集 - これが答えです

MySQL 5.1 を MariaDB 5.5 に変更し、高速化しました!!!

4

4 に答える 4

2

残念ながら、データベースの設計によりパフォーマンスが低下しています。

これにより、パフォーマンスの問題が解決されます。新しいテーブル (PRODUCT_INFO) を作成し、製品の主キーを指す外部キーを作成する必要があります。ATTRIBUTE_CODE と ATTRIBUTE_VALUE の個々の値をこのテーブルに入力します。

SELECT pa.code
FROM ParametrickeVyhladavanie pa
WHERE EXISTS
(
SELECT 1 FROM produkty p
JOIN 
PRODUCT_INFO AS pi
ON    p.ProId = pi.ProduktID
WHERE pi.ATTRIBUTE_CODE = pa.Code
AND pi.ATTRIBUTE_VALUE = pa.ValueCode
AND p.KATEGORIA IN ('Mobily'))
GROUP BY pa.code
于 2013-08-02T08:29:38.553 に答える
0

これはどう?concat の代わりに convert を使用する

SELECT pa.*
FROM ParametrickeVyhladavanie pa
JOIN produkty p
ON p.ATTRIBUTE_CODE LIKE CONVERT(NVARCHAR,'%')+ pa.code + CONVERT(NVARCHAR,'%')
AND p.ATTRIBUTE_VALUE LIKE CONVERT(NVARCHAR,'%')+ pa.ValueCode+CONVERT(NVARCHAR,'%')
AND p.KATEGORIA IN ('$categoryArray')
GROUP BY pa.code
于 2013-08-02T09:39:55.823 に答える