2016-07-22 3 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 (고유) 및 sub_category는 색인됩니다.

내가 마스터로 그룹화하여 제품 변형 수를 계산하고 주문할 수있는 필수적인 요소 인 것처럼이 질문에 접근하는 또 다른 방법은 생각할 수 없습니다 (반드시 stock_id로 작성해야하는 것은 아니지만 그렇습니다). 기본값). 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, stock_id에 대한 인덱스가 있습니다 (고유 한 컬럼입니다) –

1

설명의 결과를 제공하지 않았지만 조회에 따라 ORDER BY가 전체 표 스캔을 강제 실행하는 것으로 보입니다. 그러면 쿼리가 매우 느려질 것입니다.

ORDER BY를 사용하지 않으면 db는 첫 번째 20 master 값의 결과를 읽고 그 중 몇 개를 그룹화 한 다음 결과를 반환합니다. 당신은 전체 테이블이 master의 가장 낮은 값과 연관되는 찾아 보았다해야 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, master를 시도했으며 여전히 6 초가 걸렸습니다. 또한 쇼 만들기 테이블을 공유하고 위의 내 게시물에서 설명합니다. 시간 내 주셔서 감사합니다. –

+0

불행히도 그것의 아무도는 당신을 멀리 얻지 않을 것이다. 데이터를 표준화해야합니다. – e4c5