mysql - 使用索引使sql查询更快

标签 mysql sql

我有以下查询(简化):

EXPLAIN (SELECT phppos_sales.deleted as deleted,phppos_sales.deleted_by as deleted_by, sale_time, date(sale_time) as sale_date, 
phppos_sales_items.sale_id, comment,payment_type, customer_id, employee_id, phppos_items.item_id, NULL as item_kit_id, 
supplier_id, quantity_purchased, item_cost_price, item_unit_price, category, discount_percent 
FROM phppos_sales_items 
INNER JOIN phppos_sales FORCE INDEX (sales_search) 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-01 00:00:00" and "2014-03-31 23:59:59" and phppos_sales.location_id='1' and phppos_sales.store_account_payment=0)

+----+-------------+--------------------------+--------+-----------------+--------------+---------+-------------------------------------------------------------------------------------+-------+-------------+
| id | select_type | table                    | type   | possible_keys   | key          | key_len | ref                                                                                 | rows  | Extra       |
+----+-------------+--------------------------+--------+-----------------+--------------+---------+-------------------------------------------------------------------------------------+-------+-------------+
|  1 | SIMPLE      | phppos_sales             | range  | sales_search    | sales_search | 12      | NULL                                                                                | 13098 | Using where |
|  1 | SIMPLE      | phppos_sales_items       | ref    | PRIMARY,item_id | PRIMARY      | 4       | pos.phppos_sales.sale_id                                                            |     1 |             |
|  1 | SIMPLE      | phppos_items             | eq_ref | PRIMARY         | PRIMARY      | 4       | pos.phppos_sales_items.item_id                                                      |     1 |             |
|  1 | SIMPLE      | phppos_suppliers         | ref    | person_id       | person_id    | 4       | pos.phppos_items.supplier_id                                                        |     1 | Using index |
|  1 | SIMPLE      | phppos_sales_items_taxes | ref    | PRIMARY,item_id | PRIMARY      | 12      | pos.phppos_sales.sale_id,pos.phppos_sales_items.item_id,pos.phppos_sales_items.line |     1 | Using index |
+----+-------------+--------------------------+--------+-----------------+--------------+---------+-------------------------------------------------------------------------------------+-------+-------------+


mysql> show create table phppos_sales;
+--------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table        | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
+--------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| phppos_sales | CREATE TABLE `phppos_sales` (
  `sale_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `customer_id` int(10) DEFAULT NULL,
  `employee_id` int(10) NOT NULL DEFAULT '0',
  `comment` text COLLATE utf8_unicode_ci NOT NULL,
  `show_comment_on_receipt` int(1) NOT NULL DEFAULT '0',
  `sale_id` int(10) NOT NULL AUTO_INCREMENT,
  `payment_type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `cc_ref_no` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `auth_code` varchar(255) COLLATE utf8_unicode_ci DEFAULT '',
  `deleted_by` int(10) DEFAULT NULL,
  `deleted` int(1) NOT NULL DEFAULT '0',
  `suspended` int(1) NOT NULL DEFAULT '0',
  `store_account_payment` int(1) NOT NULL DEFAULT '0',
  `location_id` int(11) NOT NULL,
  PRIMARY KEY (`sale_id`),
  KEY `customer_id` (`customer_id`),
  KEY `employee_id` (`employee_id`),
  KEY `deleted` (`deleted`),
  KEY `location_id` (`location_id`),
  KEY `phppos_sales_ibfk_4` (`deleted_by`),
  KEY `suspended` (`suspended`),
  KEY `sales_search` (`sale_time`,`location_id`,`store_account_payment`,`suspended`),
  CONSTRAINT `phppos_sales_ibfk_3` FOREIGN KEY (`location_id`) REFERENCES `phppos_locations` (`location_id`),
  CONSTRAINT `phppos_sales_ibfk_4` FOREIGN KEY (`deleted_by`) REFERENCES `phppos_employees` (`person_id`)
) ENGINE=InnoDB AUTO_INCREMENT=109948 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
+--------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

完整查询(未简化):

EXPLAIN  (SELECT phppos_sales.deleted as deleted,phppos_sales.deleted_by as deleted_by, sale_time, date(sale_time) as sale_date, phppos_sales_items.sale_id, comment,payment_type, customer_id, employee_id, phppos_items.item_id, NULL as item_kit_id, supplier_id, quantity_purchased, 
item_cost_price, item_unit_price, category, discount_percent, 
(item_unit_price*quantity_purchased-item_unit_price*quantity_purchased*discount_percent/100) as subtotal, 
phppos_sales_items.line as line, serialnumber, phppos_sales_items.description as description, 
(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,
 (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 tax, 
 (item_unit_price*quantity_purchased-item_unit_price*quantity_purchased*discount_percent/100) - (item_cost_price*quantity_purchased) as profit 
 FROM phppos_sales_items INNER JOIN phppos_sales FORCE INDEX (sales_search) 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-01 00:00:00" and "2014-03-31 23:59:59" and phppos_sales.location_id='1' and phppos_sales.store_account_payment=0 GROUP BY sale_id, item_id, line) 

UNION ALL 
(SELECT phppos_sales.deleted as deleted,phppos_sales.deleted_by as deleted_by, sale_time, date(sale_time) as sale_date, phppos_sales_item_kits.sale_id, comment,payment_type, customer_id, employee_id, NULL as item_id, phppos_item_kits.item_kit_id, '' as supplier_id, quantity_purchased, item_kit_cost_price, item_kit_unit_price, category, discount_percent, 
(item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100) as subtotal, 
phppos_sales_item_kits.line as line, '' as serialnumber, phppos_sales_item_kits.description as description, (item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)+(item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)*(SUM(CASE WHEN cumulative != 1 THEN percent ELSE 0 END)/100) +(((item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)*(SUM(CASE WHEN cumulative != 1 THEN percent ELSE 0 END)/100) + (item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)) *(SUM(CASE WHEN cumulative = 1 THEN percent ELSE 0 END))/100) as total, 
(item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)*(SUM(CASE WHEN cumulative != 1 THEN percent ELSE 0 END)/100) +(((item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)*(SUM(CASE WHEN cumulative != 1 THEN percent ELSE 0 END)/100) + (item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)) *(SUM(CASE WHEN cumulative = 1 THEN percent ELSE 0 END))/100) as tax, 
(item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100) - (item_kit_cost_price*quantity_purchased) as profit 
FROM phppos_sales_item_kits 
INNER JOIN phppos_sales FORCE INDEX (sales_search) ON phppos_sales_item_kits.sale_id=phppos_sales.sale_id 
INNER JOIN phppos_item_kits ON phppos_sales_item_kits.item_kit_id=phppos_item_kits.item_kit_id 
LEFT OUTER JOIN phppos_sales_item_kits_taxes ON phppos_sales_item_kits.sale_id=phppos_sales_item_kits_taxes.sale_id and phppos_sales_item_kits.item_kit_id=phppos_sales_item_kits_taxes.item_kit_id and phppos_sales_item_kits.line=phppos_sales_item_kits_taxes.line 
WHERE sale_time BETWEEN "2014-03-01 00:00:00" and "2014-03-31 23:59:59" and phppos_sales.location_id='1' and phppos_sales.store_account_payment=0 GROUP BY sale_id, item_kit_id, line)

+----+--------------+------------------------------+--------+---------------------+--------------+---------+-----------------------------------------------------------------------------------------------------------+-------+----------------------------------------------+
| id | select_type  | table                        | type   | possible_keys       | key          | key_len | ref                                                                                                       | rows  | Extra                                        |
+----+--------------+------------------------------+--------+---------------------+--------------+---------+-----------------------------------------------------------------------------------------------------------+-------+----------------------------------------------+
|  1 | PRIMARY      | phppos_sales                 | range  | sales_search        | sales_search | 12      | NULL                                                                                                      | 13098 | Using where; Using temporary; Using filesort |
|  1 | PRIMARY      | phppos_sales_items           | ref    | PRIMARY,item_id     | PRIMARY      | 4       | pos.phppos_sales.sale_id                                                                                  |     1 |                                              |
|  1 | PRIMARY      | phppos_items                 | eq_ref | PRIMARY             | PRIMARY      | 4       | pos.phppos_sales_items.item_id                                                                            |     1 |                                              |
|  1 | PRIMARY      | phppos_suppliers             | ref    | person_id           | person_id    | 4       | pos.phppos_items.supplier_id                                                                              |     1 | Using index                                  |
|  1 | PRIMARY      | phppos_sales_items_taxes     | ref    | PRIMARY,item_id     | PRIMARY      | 12      | pos.phppos_sales.sale_id,pos.phppos_sales_items.item_id,pos.phppos_sales_items.line                       |     1 |                                              |
|  2 | UNION        | phppos_sales_item_kits       | ALL    | PRIMARY,item_kit_id | NULL         | NULL    | NULL                                                                                                      |     1 | Using temporary; Using filesort              |
|  2 | UNION        | phppos_item_kits             | eq_ref | PRIMARY             | PRIMARY      | 4       | pos.phppos_sales_item_kits.item_kit_id                                                                    |     1 |                                              |
|  2 | UNION        | phppos_sales_item_kits_taxes | ref    | PRIMARY,item_id     | PRIMARY      | 12      | pos.phppos_sales_item_kits.sale_id,pos.phppos_sales_item_kits.item_kit_id,pos.phppos_sales_item_kits.line |     1 |                                              |
|  2 | UNION        | phppos_sales                 | range  | sales_search        | sales_search | 12      | NULL                                                                                                      | 13098 | Using where; Using join buffer               |
| NULL | UNION RESULT | <union1,2>                   | ALL    | NULL                | NULL         | NULL    | NULL                                                                                                      |  NULL |                                              |
+----+--------------+------------------------------+--------+---------------------+--------------+---------+-----------------------------------------------------------------------------------------------------------+-------+----------------------------------------------+

编辑:从步骤 C 开始的新解释:

mysql> EXPLAIN (SELECT phppos_sales.deleted as deleted,phppos_sales.deleted_by as deleted_by, sale_time, date(sale_time) as sale_date, phppos_sales_items.sale_id, comment,payment_type, customer_id, employee_id, phppos_items.item_id, NULL as item_kit_id, supplier_id, quantity_purchased,      item_cost_price, item_unit_price, category, discount_percent,      (item_unit_price*quantity_purchased-item_unit_price*quantity_purchased*discount_percent/100) as subtotal,      phppos_sales_items.line as line, serialnumber, phppos_sales_items.description as description,      (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,      (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 tax,       (item_unit_price*quantity_purchased-item_unit_price*quantity_purchased*discount_percent/100) - (item_cost_price*quantity_purchased) as profit       FROM phppos_sales INNER JOIN phppos_sales_items 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 phppos_sales.sale_id between 103194 and 109743 and sale_time BETWEEN "2014-03-01 00:00:00" and "2014-03-31 23:59:59" GROUP BY sale_id, item_id, line)       UNION ALL      (SELECT phppos_sales.deleted as deleted,phppos_sales.deleted_by as deleted_by, sale_time, date(sale_time) as sale_date, phppos_sales_item_kits.sale_id, comment,payment_type, customer_id, employee_id, NULL as item_id, phppos_item_kits.item_kit_id, '' as supplier_id, quantity_purchased, item_kit_cost_price, item_kit_unit_price, category, discount_percent,      (item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100) as subtotal,      phppos_sales_item_kits.line as line, '' as serialnumber, phppos_sales_item_kits.description as description, (item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)+(item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)*(SUM(CASE WHEN cumulative != 1 THEN percent ELSE 0 END)/100) +(((item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)*(SUM(CASE WHEN cumulative != 1 THEN percent ELSE 0 END)/100) + (item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)) *(SUM(CASE WHEN cumulative = 1 THEN percent ELSE 0 END))/100) as total,      (item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)*(SUM(CASE WHEN cumulative != 1 THEN percent ELSE 0 END)/100) +(((item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)*(SUM(CASE WHEN cumulative != 1 THEN percent ELSE 0 END)/100) + (item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)) *(SUM(CASE WHEN cumulative = 1 THEN percent ELSE 0 END))/100) as tax,      (item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100) - (item_kit_cost_price*quantity_purchased) as profit      FROM phppos_sales      INNER JOIN phppos_sales_item_kits ON phppos_sales_item_kits.sale_id=phppos_sales.sale_id      INNER JOIN phppos_item_kits ON phppos_sales_item_kits.item_kit_id=phppos_item_kits.item_kit_id      LEFT OUTER JOIN phppos_sales_item_kits_taxes ON phppos_sales_item_kits.sale_id=phppos_sales_item_kits_taxes.sale_id and phppos_sales_item_kits.item_kit_id=phppos_sales_item_kits_taxes.item_kit_id and phppos_sales_item_kits.line=phppos_sales_item_kits_taxes.line      WHERE phppos_sales.sale_id between 103194 and 109743 AND  sale_time BETWEEN "2014-03-01 00:00:00" and "2014-03-31 23:59:59" GROUP BY sale_id, item_kit_id, line);
+----+--------------+------------------------------+--------+---------------------+-------------+---------+-----------------------------------------------------------------------------------------------------------------------------------+-------+----------------------------------------------+
| id | select_type  | table                        | type   | possible_keys       | key         | key_len | ref                                                                                                                               | rows  | Extra                                        |
+----+--------------+------------------------------+--------+---------------------+-------------+---------+-----------------------------------------------------------------------------------------------------------------------------------+-------+----------------------------------------------+
|  1 | PRIMARY      | phppos_sales                 | range  | PRIMARY             | PRIMARY     | 4       | NULL                                                                                                                              | 12878 | Using where; Using temporary; Using filesort |
|  1 | PRIMARY      | phppos_sales_items           | ref    | PRIMARY,item_id     | PRIMARY     | 4       | pos_compare.phppos_sales.sale_id                                                                                                  |     1 |                                              |
|  1 | PRIMARY      | phppos_items                 | eq_ref | PRIMARY             | PRIMARY     | 4       | pos_compare.phppos_sales_items.item_id                                                                                            |     1 |                                              |
|  1 | PRIMARY      | phppos_suppliers             | ref    | person_id           | person_id   | 4       | pos_compare.phppos_items.supplier_id                                                                                              |     1 | Using index                                  |
|  1 | PRIMARY      | phppos_sales_items_taxes     | ref    | PRIMARY,item_id     | PRIMARY     | 12      | pos_compare.phppos_sales.sale_id,pos_compare.phppos_sales_items.item_id,pos_compare.phppos_sales_items.line                       |     1 |                                              |
|  2 | UNION        | phppos_item_kits             | ALL    | PRIMARY             | NULL        | NULL    | NULL                                                                                                                              |     1 | Using temporary; Using filesort              |
|  2 | UNION        | phppos_sales_item_kits       | ref    | PRIMARY,item_kit_id | item_kit_id | 4       | pos_compare.phppos_item_kits.item_kit_id                                                                                          |     1 | Using where                                  |
|  2 | UNION        | phppos_sales_item_kits_taxes | ref    | PRIMARY,item_id     | PRIMARY     | 12      | pos_compare.phppos_sales_item_kits.sale_id,pos_compare.phppos_sales_item_kits.item_kit_id,pos_compare.phppos_sales_item_kits.line |     1 |                                              |
|  2 | UNION        | phppos_sales                 | eq_ref | PRIMARY             | PRIMARY     | 4       | pos_compare.phppos_sales_item_kits.sale_id                                                                                        |     1 | Using where                                  |
| NULL | UNION RESULT | <union1,2>                   | ALL    | NULL                | NULL        | NULL    | NULL                                                                                                                              |  NULL |                                              |
+----+--------------+------------------------------+--------+---------------------+-------------+---------+-----------------------------------------------------------------------------------------------------------------------------------+-------+----------------------------------------------+
10 rows in set (0.00 sec)

最佳答案

索引 phppos_sales 没有按您希望的那样工作,因为您请求了 sale_id 的聚合。 为了优化您的查询时间,这是我的建议(抱歉,我没有您的数据,因此无法测试):

一个。将您的 key sales_search 更改为:

KEY `sales_search` (`location_id`,`store_account_payment`,`sale_time`,`sale_id`)

(相等条件必须先于范围条件..)

B.计算并保存本次请求的结果

   SELECT MIN(sales_id) as min_id, MAX(sales_id) as max_id FROM phppos_sales
    WHERE sale_time BETWEEN "2014-03-01 00:00:00" and "2014-03-31 23:59:59" and phppos_sales.location_id='1' and phppos_sales.store_account_payment=0

这应该使用 sales_search。

C.运行这个请求

(将@min_id 和@max_id 替换为在步骤 2 中计算的值)

SELECT phppos_sales.deleted as deleted,phppos_sales.deleted_by as deleted_by, sale_time, date(sale_time) as sale_date, phppos_sales_items.sale_id, comment,payment_type, customer_id, employee_id, phppos_items.item_id, NULL as item_kit_id, supplier_id, quantity_purchased, 
    item_cost_price, item_unit_price, category, discount_percent, 
    (item_unit_price*quantity_purchased-item_unit_price*quantity_purchased*discount_percent/100) as subtotal, 
    phppos_sales_items.line as line, serialnumber, phppos_sales_items.description as description, 
    (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,
     (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 tax, 
     (item_unit_price*quantity_purchased-item_unit_price*quantity_purchased*discount_percent/100) - (item_cost_price*quantity_purchased) as profit 
     FROM phppos_sales INNER JOIN phppos_sales_items 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_id between @min_id and @max_id  sale_time BETWEEN "2014-03-01 00:00:00" and "2014-03-31 23:59:59" GROUP BY sale_id, item_id, line) 

    UNION ALL 
    (SELECT phppos_sales.deleted as deleted,phppos_sales.deleted_by as deleted_by, sale_time, date(sale_time) as sale_date, phppos_sales_item_kits.sale_id, comment,payment_type, customer_id, employee_id, NULL as item_id, phppos_item_kits.item_kit_id, '' as supplier_id, quantity_purchased, item_kit_cost_price, item_kit_unit_price, category, discount_percent, 
    (item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100) as subtotal, 
    phppos_sales_item_kits.line as line, '' as serialnumber, phppos_sales_item_kits.description as description, (item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)+(item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)*(SUM(CASE WHEN cumulative != 1 THEN percent ELSE 0 END)/100) +(((item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)*(SUM(CASE WHEN cumulative != 1 THEN percent ELSE 0 END)/100) + (item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)) *(SUM(CASE WHEN cumulative = 1 THEN percent ELSE 0 END))/100) as total, 
    (item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)*(SUM(CASE WHEN cumulative != 1 THEN percent ELSE 0 END)/100) +(((item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)*(SUM(CASE WHEN cumulative != 1 THEN percent ELSE 0 END)/100) + (item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100)) *(SUM(CASE WHEN cumulative = 1 THEN percent ELSE 0 END))/100) as tax, 
    (item_kit_unit_price*quantity_purchased-item_kit_unit_price*quantity_purchased*discount_percent/100) - (item_kit_cost_price*quantity_purchased) as profit 
    FROM phppos_sales 
    INNER JOIN phppos_sales_item_kits ON phppos_sales_item_kits.sale_id=phppos_sales.sale_id 
    INNER JOIN phppos_item_kits ON phppos_sales_item_kits.item_kit_id=phppos_item_kits.item_kit_id 
    LEFT OUTER JOIN phppos_sales_item_kits_taxes ON phppos_sales_item_kits.sale_id=phppos_sales_item_kits_taxes.sale_id and phppos_sales_item_kits.item_kit_id=phppos_sales_item_kits_taxes.item_kit_id and phppos_sales_item_kits.line=phppos_sales_item_kits_taxes.line 
    WHERE sale_id between @min_id and @max_id AND  sale_time BETWEEN "2014-03-01 00:00:00" and "2014-03-31 23:59:59"
GROUP BY sale_id, item_kit_id, line

请告诉我们它的表现如何。主键现在应该是规划器的一个不错的选择,因为它是按“符合分组”顺序排序的,因此不需要文件排序。

好的,我在这里建议一个应该是“最佳案例”的请求,并将为我们提供优化目标。您能告诉我们执行计划和执行时间吗?

(SELECT phppos_sales.sale_id, count(*) as nb_sales 
     FROM phppos_sales INNER JOIN phppos_sales_items 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_id between @min_id and @max_id  sale_time BETWEEN "2014-03-01 00:00:00" and "2014-03-31 23:59:59" GROUP BY sale_id
    ) 
    UNION ALL 
    (
SELECT phppos_sales.sale_id,  count(*)
    FROM phppos_sales 
    INNER JOIN phppos_sales_item_kits ON phppos_sales_item_kits.sale_id=phppos_sales.sale_id 
    INNER JOIN phppos_item_kits ON phppos_sales_item_kits.item_kit_id=phppos_item_kits.item_kit_id 
    LEFT OUTER JOIN phppos_sales_item_kits_taxes ON phppos_sales_item_kits.sale_id=phppos_sales_item_kits_taxes.sale_id and phppos_sales_item_kits.item_kit_id=phppos_sales_item_kits_taxes.item_kit_id and phppos_sales_item_kits.line=phppos_sales_item_kits_taxes.line 
    WHERE sale_id between @min_id and @max_id AND  sale_time BETWEEN "2014-03-01 00:00:00" and "2014-03-31 23:59:59"
GROUP BY sale_id )

关于mysql - 使用索引使sql查询更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22805723/

相关文章:

sql - 我不完全理解 sqlite3_finalize

mysql - sql查询得到这个结果

Mysql 查询第一次和第二次执行给出不同的计数

php - 与 PHP/SQL 问题作斗争

mysql - 带有数据聚合的 SQL 循环

sql - 错误 : operator does not exist: integer == integer

sql - mysql - 同一张表上的三个连接

mysql - SQL OR 子句优先级

mysql - 根据同一表中其他行的值更新行

mysql - SQL:查询语法错误