2016-07-22 13 views
0

次のクエリでお手伝いできますか? (180352行)ご注文のために簡単なクエリが非常に遅い

SELECT COUNT(p.stock_id) AS num_products, 
p.master_photo, p.product_photo, p.stock_id, p.master, p.title, p.price, p.stock_level, p.on_order, p.location, p.supplier, p.category, p.sub_category, p.reorder 
FROM products AS p 
WHERE p.sub_category != 'Subscriptions' 
GROUP BY p.master 
ORDER BY p.stock_id ASC 
LIMIT 0, 20 

6秒で実行されています。

注文を削除すると、0.0023秒で実行されます。

また、グループを削除するときも同じです。

stock_id(unique)とsub_categoryは索引付けされています。

私は、マスターによってグループ化された商品バリエーションの数を取得することが重要であり、注文できることも重要です(これは必ずしも株価ではありませんが、それは必須です)デフォルト)。以下e4c5によって要求されたよう

はあなたに


ありがとう

id: 1 
select_type: SIMPLE 
table: p 
type: index 
possible_keys: sub_category 
key: master 
key_len: 52 
ref: NULL 
rows: 21 
Extra: Using where 

によって順序なし

id: 1 
select_type: SIMPLE 
table: p 
type: range 
possible_keys: sub_category 
key: sub_category 
key_len: 52 
ref: NULL 
rows: 181691 
Extra: Using where; Using temporary; Using filesort 

、その後、順に説明した結果であります

とし、下にcreat eテーブル

CREATE TABLE IF NOT EXISTS `products` (
    `stock_id` varchar(50) NOT NULL, 
    `conv_stock_id` varchar(100) NOT NULL, 
    `conv_quantity` decimal(10,2) NOT NULL, 
    `master` varchar(50) NOT NULL, 
    `master_photo` varchar(255) NOT NULL, 
    `free_guide_photo` varchar(255) NOT NULL, 
    `product_var_photo` varchar(255) NOT NULL, 
    `master_title` varchar(255) NOT NULL, 
    `master_slug` varchar(255) NOT NULL, 
    `master_page_title` varchar(255) NOT NULL, 
    `product_photo` varchar(255) NOT NULL, 
    `original_product_photo` varchar(255) NOT NULL, 
    `title` varchar(255) NOT NULL, 
    `orig_title` varchar(255) NOT NULL, 
    `page_title` varchar(255) NOT NULL, 
    `description` longtext NOT NULL, 
    `slug` varchar(255) NOT NULL, 
    `custom_url` varchar(255) NOT NULL, 
    `location` varchar(255) NOT NULL, 
    `supplier` varchar(50) NOT NULL, 
    `supplier_stock_id` varchar(50) NOT NULL, 
    `supplier_discount` int(11) NOT NULL, 
    `category` varchar(50) NOT NULL, 
    `sub_category` varchar(50) NOT NULL, 
    `cost_price` decimal(10,2) NOT NULL, 
    `discount_cost_price` decimal(10,2) NOT NULL, 
    `price` decimal(10,2) NOT NULL, 
    `sale_price` decimal(10,2) NOT NULL, 
    `sale_price_startdate` date NOT NULL, 
    `sale_price_enddate` date NOT NULL, 
    `orig_price_trail` int(3) NOT NULL, 
    `price_trail` varchar(50) NOT NULL, 
    `price_rule` int(1) NOT NULL, 
    `pack_size` int(11) NOT NULL, 
    `parcel_size` int(1) NOT NULL, 
    `packaging_rule` int(11) NOT NULL, 
    `cut_tear` int(1) NOT NULL, 
    `oversized_parcel` int(1) NOT NULL, 
    `print_label` int(1) NOT NULL, 
    `stock_level` decimal(10,1) NOT NULL, 
    `stock_level_group` varchar(50) NOT NULL, 
    `stock_level_increment` decimal(10,2) NOT NULL, 
    `stock_check_date` datetime NOT NULL, 
    `reorder` int(1) NOT NULL, 
    `reorder_level` decimal(10,1) NOT NULL, 
    `reorder_quantity` decimal(10,1) NOT NULL, 
    `reorder_attempts` int(1) NOT NULL, 
    `unit_size` decimal(10,1) NOT NULL, 
    `on_order` decimal(10,1) NOT NULL, 
    `date_ordered` datetime NOT NULL, 
    `back_order` decimal(10,1) NOT NULL, 
    `uom` decimal(10,1) NOT NULL, 
    `uom_value` varchar(100) NOT NULL, 
    `stock_estimate` int(1) NOT NULL, 
    `due_date` datetime NOT NULL, 
    `quantity` varchar(255) NOT NULL, 
    `colour` varchar(255) NOT NULL, 
    `colour_family` varchar(255) NOT NULL, 
    `type` varchar(255) NOT NULL, 
    `style` varchar(255) NOT NULL, 
    `pattern` varchar(255) NOT NULL, 
    `shape` varchar(255) NOT NULL, 
    `design` varchar(255) NOT NULL, 
    `fibre` varchar(255) NOT NULL, 
    `material` varchar(255) NOT NULL, 
    `pattern_for` varchar(255) NOT NULL, 
    `difficulty` varchar(255) NOT NULL, 
    `fabric_count` varchar(255) NOT NULL, 
    `yarn_thickness` varchar(255) NOT NULL, 
    `suggested_needle_size` varchar(255) NOT NULL, 
    `tension` varchar(255) NOT NULL, 
    `collections` varchar(255) NOT NULL, 
    `product_features` varchar(255) NOT NULL, 
    `size` varchar(255) NOT NULL, 
    `actual_size` varchar(255) NOT NULL, 
    `length` varchar(255) NOT NULL, 
    `width` varchar(255) NOT NULL, 
    `weight` varchar(255) NOT NULL, 
    `weight_gsm` varchar(255) NOT NULL, 
    `brand` varchar(255) NOT NULL, 
    `designer` varchar(255) NOT NULL, 
    `composition` varchar(255) NOT NULL, 
    `washing_instructions` varchar(255) NOT NULL, 
    `matching_thread` varchar(50) NOT NULL, 
    `sample` varchar(50) NOT NULL, 
    `fat_quarter` varchar(50) NOT NULL, 
    `barcode` varchar(13) NOT NULL, 
    `list_international` int(1) NOT NULL, 
    `token` varchar(50) NOT NULL, 
    `create_sample` int(1) NOT NULL, 
    `create_fatquarter` int(1) NOT NULL, 
    `create_listing_type` int(1) NOT NULL, 
    `create_listing_size` int(11) NOT NULL, 
    `create_listing_price` decimal(10,2) NOT NULL, 
    `create_listing_price_rule` int(11) NOT NULL, 
    `create_listing_sale_price` decimal(10,2) NOT NULL, 
    `create_listing_parcelsize` int(1) NOT NULL, 
    `create_listing_barcode` varchar(13) NOT NULL, 
    `auto_listing` int(1) NOT NULL, 
    `custom_bridal` int(1) NOT NULL, 
    `pickwave_assign` int(1) NOT NULL, 
    `kit_product` int(11) NOT NULL, 
    `fatquarter_product` int(1) NOT NULL, 
    `sample_product` int(1) NOT NULL, 
    `grouped_product` int(1) NOT NULL, 
    `grouped_product_quantity` decimal(10,1) NOT NULL, 
    `multiple_product` int(1) NOT NULL, 
    `freepost_product` int(1) NOT NULL, 
    `status` int(1) NOT NULL, 
    `update_stock_level` int(1) NOT NULL, 
    `force_product_photo` int(1) NOT NULL, 
    `created_master_photo` int(1) NOT NULL, 
    `force_master_photo` int(1) NOT NULL, 
    `created_free_guide_photo` int(1) NOT NULL, 
    `force_free_guide_photo` int(1) NOT NULL, 
    `created_product_var_photo` int(1) NOT NULL, 
    `force_product_var_photo` int(1) NOT NULL, 
    `force_additional_photo` int(1) NOT NULL, 
    `created_price_levelling` int(1) NOT NULL, 
    `created_grouped_product` int(1) NOT NULL, 
    `updated_stock_level` int(1) NOT NULL, 
    `create_multiple_listing` int(1) NOT NULL, 
    `create_freepost_listing` int(1) NOT NULL, 
    `create_freeguide_info` int(1) NOT NULL, 
    `created_by` int(11) NOT NULL, 
    `date_created` datetime NOT NULL, 
    UNIQUE KEY `stock_id` (`stock_id`), 
    KEY `token` (`token`), 
    KEY `title` (`title`), 
    KEY `stock_level_group` (`stock_level_group`), 
    KEY `sub_category` (`sub_category`), 
    KEY `stock_level` (`stock_level`), 
    KEY `category` (`category`), 
    KEY `conv_stock_id` (`conv_stock_id`), 
    KEY `conv_quantity` (`conv_quantity`), 
    KEY `created_price_levelling` (`created_price_levelling`), 
    KEY `master` (`master`), 
    KEY `colour` (`colour`), 
    KEY `auto_listing` (`auto_listing`), 
    KEY `multiple_product` (`multiple_product`), 
    KEY `status` (`status`), 
    KEY `ebay_master` (`ebay_master`), 
    KEY `parcel_size` (`parcel_size`), 
    KEY `grouped_product` (`grouped_product`), 
    KEY `sample_product` (`sample_product`), 
    KEY `fatquarter_product` (`fatquarter_product`), 
    KEY `created_grouped_product` (`created_grouped_product`), 
    KEY `price` (`price`), 
    KEY `freepost_product` (`freepost_product`), 
    KEY `master_title` (`master_title`), 
    KEY `c_sub_category_master` (`sub_category`,`master`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
+0

'GROUP BY'は' ORDER BY'と同じくらい遅くなければなりません。 –

+0

なぜすべての行が必要ですか?真剣にあなたは同時に180352行が必要ですか?おそらくそれはあなたを助けるでしょう。 – Grommy

+0

マスターにインデックスを追加しようとしましたか?あなたはそれによってグルーピングしています。 – spiderman

答えて

0

productsテーブルのstock_idにインデックスを追加してみてください。役立つはずです。

+0

こんにちはStuartMc、株価指数があります(ユニークな列です) –

1

説明からの出力は提供されていませんが、問合せに基づいて、ORDER BYは完全な表スキャンを強制しているように見えます。それはクエリを非常に遅くするでしょう。

ORDER BYを使用しない場合、dbは最初の20 master値(多分かなりの数)の結果を読み取り、それらをまとめてグループ化し、結果を返します。あなたはテーブル全体がmaster sが最低値に関連付けられているを見つけるために見てする必要がstock_idで注文する場合はsub_category,master上の複合インデックスのパフォーマンスを向上させるために

stock_id

それは多分可能しかし、結論はできませんSHOW CREATE TABLES、EXPLAIN出力を共有しないかぎり、作成する必要があります。

更新 CREATE TABLEステートメントに基づいて、データベースが正規化されていないことがわかります。例えば、次のような列が自分のテーブルの中にあるべきであると感じる理由は何ですか?

supplier varchar(50) NOT NULL, 
    supplier_stock_id varchar(50) NOT NULL, 
    supplier_discount int(11) NOT NULL, 

あなたは、あなたの製品テーブルのsupplier_stock_id(仕入先テーブルへの外部キー)を持つべきです。実際に移動する必要がある同様の列のセットがあります。

このようにすると、このテーブルにより細い索引や中間の索引を作成できます。しかし、それはすべてのテーブルが狭くなるわけではありません。これは、フルテーブルスキャンの最悪のシナリオが実際にはるかに高速になることを意味します。

テーブルに主キーがないことに気付きました。それは大きなノーではありません。もしそれが数値ならば、stock_idは主キーでなければなりません。数値でない場合は、主キーの候補になる可能性がありますが、これは決定する必要があります。

+0

こんにちはe4c5、私は複合インデックスsub_categoryを試しました。マスターで、まだ6秒かかっています。私はまた、ショーの作成テーブルを共有し、上記の私のポストで説明します。あなたの時間をありがとう。 –

+0

残念ながら、そのどれもあなたを遠ざけることはありません。データを正規化する必要があります – e4c5

関連する問題