这是我所创建的视图CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_order_paid` AS
select
cast(`order_list`.`CreateDate` as date) AS `CreateDate`,
sum(((`order_list`.`SendMailStatus` = 0) and (`order_list`.`OrderStatus` = 2))) AS `PaidDirectly`,
sum(((`order_list`.`SendMailStatus` = 1) and (`order_list`.`OrderStatus` = 2))) AS `PaidAfterRemind`,
sum(((`order_list`.`SendMailStatus` = 3) and (`order_list`.`OrderStatus` = 2))) AS `PaidAfterInquiry`,
sum((`order_list`.`OrderStatus` = 2)) AS `PaidStat`,
count(0) AS `OrderStat`
from
`order_list`
group by
cast(`order_list`.`CreateDate` as date)
order by
`order_list`.`CreateDate`;这是Order_List表的索引情况.mysql> show index from order_list;
+------------+------------+--------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+------------+------------+--------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+
| order_list | 0 | PRIMARY | 1 | ID | A | 434643 | NULL | NULL | | BTREE | |
| order_list | 1 | ContactEmail | 1 | ContactEmail | A | 434643 | NULL | NULL | | BTREE | |
| order_list | 1 | OrderID | 1 | OrderID | A | 434643 | NULL | NULL | | BTREE | |
| order_list | 1 | CreateDate | 1 | CreateDate | A | 434643 | NULL | NULL | | BTREE | |
+------------+------------+--------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+
4 rows in set (0.34 sec)explain 语句mysql> explain select
-> cast(`order_list`.`CreateDate` as date) AS `CreateDate`,
-> sum(((`order_list`.`SendMailStatus` = 0) and (`order_list`.`OrderStatus` = 2))) AS `PaidDirectly`,
-> sum(((`order_list`.`SendMailStatus` = 1) and (`order_list`.`OrderStatus` = 2))) AS `PaidAfterRemind`,
-> sum(((`order_list`.`SendMailStatus` = 3) and (`order_list`.`OrderStatus` = 2))) AS `PaidAfterInquiry`,
-> sum((`order_list`.`OrderStatus` = 2)) AS `PaidStat`,
-> count(0) AS `OrderStat`
-> from
-> `order_list`
-> group by
-> cast(`order_list`.`CreateDate` as date)
-> order by
-> `order_list`.`CreateDate`;
+----+-------------+------------+------+---------------+------+---------+------+--------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+------+---------+------+--------+---------------------------------+
| 1 | SIMPLE | order_list | ALL | NULL | NULL | NULL | NULL | 436880 | Using temporary; Using filesort |
+----+-------------+------------+------+---------------+------+---------+------+--------+---------------------------------+
1 row in set (0.00 sec)这视图的查询速度太慢了.数据量不大,几十万而已,却每次查询都得3秒以上,求高手赐教.
select
cast(`order_list`.`CreateDate` as date) AS `CreateDate`,
sum(((`order_list`.`SendMailStatus` = 0) and (`order_list`.`OrderStatus` = 2))) AS `PaidDirectly`,
sum(((`order_list`.`SendMailStatus` = 1) and (`order_list`.`OrderStatus` = 2))) AS `PaidAfterRemind`,
sum(((`order_list`.`SendMailStatus` = 3) and (`order_list`.`OrderStatus` = 2))) AS `PaidAfterInquiry`,
sum((`order_list`.`OrderStatus` = 2)) AS `PaidStat`,
count(0) AS `OrderStat`
from
`order_list`
group by
cast(`order_list`.`CreateDate` as date)
order by
`order_list`.`CreateDate`;这是Order_List表的索引情况.mysql> show index from order_list;
+------------+------------+--------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+------------+------------+--------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+
| order_list | 0 | PRIMARY | 1 | ID | A | 434643 | NULL | NULL | | BTREE | |
| order_list | 1 | ContactEmail | 1 | ContactEmail | A | 434643 | NULL | NULL | | BTREE | |
| order_list | 1 | OrderID | 1 | OrderID | A | 434643 | NULL | NULL | | BTREE | |
| order_list | 1 | CreateDate | 1 | CreateDate | A | 434643 | NULL | NULL | | BTREE | |
+------------+------------+--------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+
4 rows in set (0.34 sec)explain 语句mysql> explain select
-> cast(`order_list`.`CreateDate` as date) AS `CreateDate`,
-> sum(((`order_list`.`SendMailStatus` = 0) and (`order_list`.`OrderStatus` = 2))) AS `PaidDirectly`,
-> sum(((`order_list`.`SendMailStatus` = 1) and (`order_list`.`OrderStatus` = 2))) AS `PaidAfterRemind`,
-> sum(((`order_list`.`SendMailStatus` = 3) and (`order_list`.`OrderStatus` = 2))) AS `PaidAfterInquiry`,
-> sum((`order_list`.`OrderStatus` = 2)) AS `PaidStat`,
-> count(0) AS `OrderStat`
-> from
-> `order_list`
-> group by
-> cast(`order_list`.`CreateDate` as date)
-> order by
-> `order_list`.`CreateDate`;
+----+-------------+------------+------+---------------+------+---------+------+--------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+------+---------+------+--------+---------------------------------+
| 1 | SIMPLE | order_list | ALL | NULL | NULL | NULL | NULL | 436880 | Using temporary; Using filesort |
+----+-------------+------------+------+---------------+------+---------+------+--------+---------------------------------+
1 row in set (0.00 sec)这视图的查询速度太慢了.数据量不大,几十万而已,却每次查询都得3秒以上,求高手赐教.
update order_list set CreateDAY=date(CreateDate)然后GROUP BY CreateDAY否则没有索引可以利用。
说的很对,group by后面的是cast(`order_list`.`CreateDate` as date)函数,mysql目前的5.1版本不支持函数索引。mysql6.0据说会增加这个功能的。
我在Order_list表中创建了CreateDAY,然后在视图里面GROUP BY CreateDAY,但是结果还是没多大用.!CREATE TABLE `order_list` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`OrderID` varchar(50) NOT NULL,
`UserID` varchar(50) NOT NULL,
`ContactEmail` varchar(70) NOT NULL DEFAULT '',
`OrderStatus` tinyint(4) NOT NULL DEFAULT '1',
`CreateDate` datetime NOT NULL,
`SendMailStatus` int(11) DEFAULT '0',
`CreateDAY` date DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `ContactEmail` (`ContactEmail`),
KEY `OrderID` (`OrderID`),
KEY `CreateDate` (`CreateDate`)
) ENGINE=InnoDB AUTO_INCREMENT=517355 DEFAULT CHARSET=utf8;select
cast(`order_list`.`CreateDate` as date) AS `CreateDate`,
sum(((`order_list`.`SendMailStatus` = 0) and (`order_list`.`OrderStatus` = 2))) AS `PaidDirectly`,
sum(((`order_list`.`SendMailStatus` = 1) and (`order_list`.`OrderStatus` = 2))) AS `PaidAfterRemind`,
sum(((`order_list`.`SendMailStatus` = 3) and (`order_list`.`OrderStatus` = 2))) AS `PaidAfterInquiry`,
sum((`order_list`.`OrderStatus` = 2)) AS `PaidStat`,
count(0) AS `OrderStat`
from
`order_list`
group by
`order_list`.`CreateDAY`
order by
`order_list`.`CreateDate`;
mysql> explain select
-> cast(`order_list`.`CreateDate` as date) AS `CreateDate`,
-> sum(((`order_list`.`SendMailStatus` = 0) and (`order_list`.`OrderStatus` = 2))) AS `PaidDirectly`,
-> sum(((`order_list`.`SendMailStatus` = 1) and (`order_list`.`OrderStatus` = 2))) AS `PaidAfterRemind`,
-> sum(((`order_list`.`SendMailStatus` = 3) and (`order_list`.`OrderStatus` = 2))) AS `PaidAfterInquiry`,
-> sum((`order_list`.`OrderStatus` = 2)) AS `PaidStat`,
-> count(0) AS `OrderStat`
-> from
-> `order_list`
-> group by
-> `order_list`.`CreateDAY`
-> order by
-> `order_list`.`CreateDAY`;
+----+-------------+------------+------+---------------+------+---------+------+--------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+------+---------+------+--------+---------------------------------+
| 1 | SIMPLE | order_list | ALL | NULL | NULL | NULL | NULL | 437440 | Using temporary; Using filesort |
+----+-------------+------------+------+---------------+------+---------+------+--------+---------------------------------+
`ID` int(11) NOT NULL AUTO_INCREMENT,
`OrderID` varchar(50) NOT NULL,
`UserID` varchar(50) NOT NULL,
`ContactEmail` varchar(70) NOT NULL DEFAULT '',
`OrderStatus` tinyint(4) NOT NULL DEFAULT '1',
`CreateDate` datetime NOT NULL,
`SendMailStatus` int(11) DEFAULT '0',
`CreateDAY` date DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `ContactEmail` (`ContactEmail`),
KEY `OrderID` (`OrderID`),
KEY `CreateDate` (`CreateDate`)
KEY `CreateDAY` (`CreateDAY`)
)
select
cast(`ol`.`CreateDate` as date) AS `CreateDate`,
sum(((`ol`.`SendMailStatus` = 0) and (`ol`.`OrderStatus` = 2))) AS `PaidDirectly`,
sum(((`ol`.`SendMailStatus` = 1) and (`ol`.`OrderStatus` = 2))) AS `PaidAfterRemind`,
sum(((`ol`.`SendMailStatus` = 3) and (`ol`.`OrderStatus` = 2))) AS `PaidAfterInquiry`,
sum((`ol`.`OrderStatus` = 2)) AS `PaidStat`,
count(0) AS `OrderStat`
from
(select order_list.*, cast(`order_list`.`CreateDate` as date) as date1 from `order_list`) ol
group by
ol.date1
order by
ol.date1;
-> cast(`order_list`.`CreateDate` as date) AS `CreateDate`,
-> sum(((`order_list`.`SendMailStatus` = 0) and (`order_list`.`OrderStatus` = 2))) AS `PaidDirectly`,
-> sum(((`order_list`.`SendMailStatus` = 1) and (`order_list`.`OrderStatus` = 2))) AS `PaidAfterRemind`,
-> sum(((`order_list`.`SendMailStatus` = 3) and (`order_list`.`OrderStatus` = 2))) AS `PaidAfterInquiry`,
-> sum((`order_list`.`OrderStatus` = 2)) AS `PaidStat`,
-> count(0) AS `OrderStat`
-> from
-> `order_list`
-> group by
-> `order_list`.`CreateDAY`
-> order by
-> `order_list`.`CreateDAY`;
+----+-------------+------------+-------+---------------+-----------+---------+------+--------+-------+
| id | select_type | table | type | possible_keys | key | key_len |ref | rows | Extra |
+----+-------------+------------+-------+---------------+-----------+---------+------+--------+-------+
| 1 | SIMPLE | order_list | index | NULL | CreateDAY | 4 |NULL | 437089 | |
+----+-------------+------------+-------+---------------+-----------+---------+------+--------+-------+
1 row in set (0.00 sec)而且查询速度更慢了.
新增加的CreateDAY字段上,你建立了索引没有啊?
+------------+------------+--------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+------------+------------+--------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+
| order_list | 0 | PRIMARY | 1 | ID | A | 437089 | NULL | NULL | | BTREE | |
| order_list | 1 | ContactEmail | 1 | ContactEmail | A | 437089 | NULL | NULL | | BTREE | |
| order_list | 1 | OrderID | 1 | OrderID | A | 437089 | NULL | NULL | | BTREE | |
| order_list | 1 | CreateDate | 1 | CreateDate | A | 437089 | NULL | NULL | | BTREE | |
| order_list | 1 | CreateDAY | 1 | CreateDAY | A | 437089 | NULL | NULL | YES | BTREE | |
+------------+------------+--------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+
5 rows in set (0.77 sec)
现在没了,
你说时间更久了..楼主是怎么看他执行的时间的?
建议用 mysql workbench吧,这个比较标准的。