2014-03-02 2 views
1

응용 프로그램에 대한 모든 보고서를 생성하는 데 사용하는 임시 테이블 테이블을 따릅니다. 그것이 수행하는 주요 기능은 주어진 판매 품목의 부분합과 합계를 계산하는 것입니다.보고서 생성을위한 임시 테이블 쿼리 성능 향상

큰 기간/판매 개수를 계산해야하는 경우 실행하는 데 최대 10 초가 걸릴 수 있습니다. 보고서를보다 효율적으로 계산할 수있는 방법을 생각해보십시오.

CREATE TEMPORARY TABLE phppos_sales_items_temp (SELECT phppos_items.item_id, phppos_sales_items.line, sale_time, 
phppos_sales_items.sale_id, payment_type, quantity_purchased, item_cost_price, item_unit_price, 
(item_unit_price*quantity_purchased-item_unit_price*quantity_purchased*discount_percent/100) as subtotal, 
(item_unit_price*quantity_purchased-item_unit_price*quantity_purchased*discount_percent/100)+(item_unit_price*quantity_purchased-item_unit_price*quantity_purchased*discount_percent/100)*(SUM(CASE WHEN cumulative != 1 THEN percent ELSE 0 END)/100) 
+(((item_unit_price*quantity_purchased-item_unit_price*quantity_purchased*discount_percent/100)*(SUM(CASE WHEN cumulative != 1 THEN percent ELSE 0 END)/100) + (item_unit_price*quantity_purchased-item_unit_price*quantity_purchased*discount_percent/100)) * 
(SUM(CASE WHEN cumulative = 1 THEN percent ELSE 0 END))/100) as total 
FROM phppos_sales_items 
INNER JOIN phppos_sales ON phppos_sales_items.sale_id=phppos_sales.sale_id 
INNER JOIN phppos_items ON phppos_sales_items.item_id=phppos_items.item_id 
LEFT OUTER JOIN phppos_suppliers ON phppos_items.supplier_id=phppos_suppliers.person_id 
LEFT OUTER JOIN phppos_sales_items_taxes ON phppos_sales_items.sale_id=phppos_sales_items_taxes.sale_id and phppos_sales_items.item_id=phppos_sales_items_taxes.item_id and phppos_sales_items.line=phppos_sales_items_taxes.line 
WHERE sale_time BETWEEN "2014-03-03 00:00:00" and "2014-03-03 23:59:59" and 
phppos_sales.location_id='1' and phppos_sales.store_account_payment=0 
GROUP BY sale_id, item_id, line) 

테이블 관련 :

mysql> describe phppos_items; 
+-----------------------+----------------+------+-----+---------+----------------+ 
| Field     | Type   | Null | Key | Default | Extra   | 
+-----------------------+----------------+------+-----+---------+----------------+ 
| name     | varchar(255) | NO | MUL | NULL |    | 
| category    | varchar(255) | NO | MUL | NULL |    | 
| supplier_id   | int(11)  | YES | MUL | NULL |    | 
| item_number   | varchar(255) | YES | UNI | NULL |    | 
| product_id   | varchar(255) | YES | UNI | NULL |    | 
| description   | varchar(255) | NO |  | NULL |    | 
| tax_included   | int(1)   | NO |  | 0  |    | 
| cost_price   | decimal(23,10) | NO |  | NULL |    | 
| unit_price   | decimal(23,10) | NO |  | NULL |    | 
| promo_price   | decimal(23,10) | YES |  | NULL |    | 
| start_date   | date   | YES |  | NULL |    | 
| end_date    | date   | YES |  | NULL |    | 
| reorder_level   | decimal(23,10) | YES |  | NULL |    | 
| item_id    | int(10)  | NO | PRI | NULL | auto_increment | 
| allow_alt_description | tinyint(1)  | NO |  | NULL |    | 
| is_serialized   | tinyint(1)  | NO |  | NULL |    | 
| image_id    | int(10)  | YES | MUL | NULL |    | 
| override_default_tax | int(1)   | NO |  | 0  |    | 
| is_service   | int(1)   | NO |  | 0  |    | 
| deleted    | int(1)   | NO | MUL | 0  |    | 
+-----------------------+----------------+------+-----+---------+----------------+ 
20 rows in set (0.00 sec) 

mysql> describe phppos_sales_items; 
+--------------------+----------------+------+-----+--------------+-------+ 
| Field    | Type   | Null | Key | Default  | Extra | 
+--------------------+----------------+------+-----+--------------+-------+ 
| sale_id   | int(10)  | NO | PRI | 0   |  | 
| item_id   | int(10)  | NO | PRI | 0   |  | 
| description  | varchar(255) | YES |  | NULL   |  | 
| serialnumber  | varchar(255) | YES |  | NULL   |  | 
| line    | int(3)   | NO | PRI | 0   |  | 
| quantity_purchased | decimal(23,10) | NO |  | 0.0000000000 |  | 
| item_cost_price | decimal(23,10) | NO |  | NULL   |  | 
| item_unit_price | decimal(23,10) | NO |  | NULL   |  | 
| discount_percent | int(11)  | NO |  | 0   |  | 
+--------------------+----------------+------+-----+--------------+-------+ 
9 rows in set (0.00 sec) 

mysql> describe phppos_suppliers; 
+----------------+--------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+----------------+--------------+------+-----+---------+-------+ 
| person_id  | int(10)  | NO | MUL | NULL |  | 
| company_name | varchar(255) | NO |  | NULL |  | 
| account_number | varchar(255) | YES | UNI | NULL |  | 
| deleted  | int(1)  | NO | MUL | 0  |  | 
+----------------+--------------+------+-----+---------+-------+ 
4 rows in set (0.01 sec) 

mysql> describe phppos_sales_items_taxes; 
+------------+---------------+------+-----+---------+-------+ 
| Field  | Type   | Null | Key | Default | Extra | 
+------------+---------------+------+-----+---------+-------+ 
| sale_id | int(10)  | NO | PRI | NULL |  | 
| item_id | int(10)  | NO | PRI | NULL |  | 
| line  | int(3)  | NO | PRI | 0  |  | 
| name  | varchar(255) | NO | PRI | NULL |  | 
| percent | decimal(15,3) | NO | PRI | NULL |  | 
| cumulative | int(1)  | NO |  | 0  |  | 
+------------+---------------+------+-----+---------+-------+ 
6 rows in set (0.00 sec) 

mysql> describe phppos_sales; 
+-------------------------+--------------+------+-----+-------------------+----------------+ 
| Field     | Type   | Null | Key | Default   | Extra   | 
+-------------------------+--------------+------+-----+-------------------+----------------+ 
| sale_time    | timestamp | NO |  | CURRENT_TIMESTAMP |    | 
| customer_id    | int(10)  | YES | MUL | NULL    |    | 
| employee_id    | int(10)  | NO | MUL | 0     |    | 
| comment     | text   | NO |  | NULL    |    | 
| show_comment_on_receipt | int(1)  | NO |  | 0     |    | 
| sale_id     | int(10)  | NO | PRI | NULL    | auto_increment | 
| payment_type   | varchar(255) | YES |  | NULL    |    | 
| cc_ref_no    | varchar(255) | NO |  | NULL    |    | 
| auth_code    | varchar(255) | YES |  |     |    | 
| deleted_by    | int(10)  | YES | MUL | NULL    |    | 
| deleted     | int(1)  | NO | MUL | 0     |    | 
| suspended    | int(1)  | NO |  | 0     |    | 
| store_account_payment | int(1)  | NO |  | 0     |    | 
| location_id    | int(11)  | NO | MUL | NULL    |    | 
+-------------------------+--------------+------+-----+-------------------+----------------+ 
14 rows in set (0.01 sec) 

답변

0

왜 다음 뷰 &을 만드는 것이보기에 어떤 인덱스를 적용하지 여기

이 예제 쿼리입니다 (그것은 임시 테이블을 포함하지/포함 할 수있다) 성능 향상을 위해?

+0

동적 뷰를 만들려면 어떻게해야합니까? sale_time between "2014-03-03 00:00:00"및 "2014-03-03 23:59:59" –

+0

또한 뷰의 인덱스가 표시되지 않습니다. mysql에서 일하지 마라. (http://stackoverflow.com/questions/244226/is-it-possible-to-have-an-indexed-view-in-mysql –