【发布时间】:2015-03-28 11:44:33
【问题描述】:
我在这个特定查询中遇到了问题,我尝试在接收表中使用索引,但它仍然使用文件排序、Mysql、一般数据库,这不是我的强项,我还在学习基础知识,我只有 8000 条记录和 7 秒查询很慢,我附上了我的查询和数据库,抱歉英语也不是我的强项,提前谢谢
1 PRIMARY re index PRIMARY,imei_index,imeibatchclientyear,batches batches 20 8326 Using index; Using temporary; Using filesort
1 PRIMARY b ref PRIMARY,batch PRIMARY 26 tracking_system_1_schema.re.clientcode,tracking_system_1_schema.re.batchnum 1 Using where
1 PRIMARY hh eq_ref PRIMARY PRIMARY 24 tracking_system_1_schema.re.imei 1 Using where; Using index
1 PRIMARY rm eq_ref PRIMARY PRIMARY 24 tracking_system_1_schema.re.imei 1 Using where
1 PRIMARY si ref PRIMARY,imei,date date 22 func,tracking_system_1_schema.re.imei 1 Using where; Using index
1 PRIMARY h ref imei_index imei_index 30 tracking_system_1_schema.b.clientcode,tracking_system_1_schema.re.batchnum,tracking_system_1_schema.re.year 136 Using where
2 DEPENDENT SUBQUERY ssi ref PRIMARY,imei imei 17 tracking_system_1_schema.re.imei 2 Using index
EXPLAIN
SELECT
b.clientcode AS 'CUSTOMER',
b.batchnum AS 'BATCH NUMBER',
b.year,
b.datereceived AS 'DATE RECEIVED',
b.quantity AS 'BATCH QTY' ,
COUNT(DISTINCT re.imei ) + COUNT(DISTINCT IFNULL(h.imei, NULL) ) AS 'RECEIVE ITEMS',
COUNT(DISTINCT IFNULL(h.imei , NULL)) AS 'SHIPPED ITEMS',
COUNT(DISTINCT re.imei ) - COUNT(DISTINCT IF(si.processcode = 51, si.imei , NULL)) - COUNT(DISTINCT IF((hh.imei = si.imei OR rm.imei= si.imei) AND si.processcode != 51 , si.imei , NULL)) AS 'WIP',
COUNT(DISTINCT IF(si.processcode = 51, si.imei , NULL)) - COUNT(DISTINCT IF((hh.imei = si.imei OR rm.imei= si.imei) AND si.processcode = 51 , si.imei , NULL)) AS 'FGS',
COUNT(DISTINCT hh.imei) + COUNT(DISTINCT rm.imei) AS 'HOLD ITEMS'
FROM
tracking_system_1_schema.scanin_process_table si
INNER JOIN
tracking_system_1_schema.receiving_table re
ON
re.imei = si.imei
LEFT OUTER JOIN
tracking_system_1_schema.hold_table hh
ON
hh.imei = re.imei
LEFT OUTER JOIN
tracking_system_1_schema.rma_status_Table rm
ON
re.imei = rm.imei
AND
rm.status = 2
INNER JOIN
tracking_system_1_schema.batch_table b
ON
b.batchnum = re.batchnum
AND
b.clientcode = re.clientcode
AND
b.year = re.year
LEFT OUTER JOIN
item_history_1_schema.item_history_table h
ON
b.batchnum = h.batchnum
AND
b.clientcode = h.clientcode
AND
b.year = h.year
WHERE
si.dateandtime =
(
SELECT
MAX(ssi.dateandtime)
FROM
tracking_system_1_schema.scanin_process_table ssi
WHERE
ssi.imei = re.imei
)
AND
(si.dateandtime <= NOW()
OR
h.departuredate <= NOW())
GROUP BY
re.clientcode,
re.batchnum ,
re.year
;
delimiter $$
CREATE TABLE `receiving_table` (
`imei` varchar(15) NOT NULL,
`modelname` varchar(20) NOT NULL,
`batchnum` int(10) NOT NULL,
`clientcode` varchar(10) NOT NULL,
`dateandtime` datetime NOT NULL,
`status` int(11) NOT NULL DEFAULT '0',
`workerid` varchar(6) NOT NULL,
`reusecount` bigint(20) NOT NULL,
`gradebatch` varchar(30) NOT NULL,
`serialnum` varchar(15) NOT NULL,
`modifydate` datetime DEFAULT NULL,
`simcarrier` varchar(20) DEFAULT NULL,
`ismanual` int(1) DEFAULT '0',
`modelnumber` varchar(15) DEFAULT NULL,
`fccid` varchar(15) DEFAULT NULL,
`rmastatus` int(11) DEFAULT '0',
`simtraystatus` varchar(15) DEFAULT 'null',
`batchtype` int(2) DEFAULT '0',
`withlcmmarking` bit(1) NOT NULL DEFAULT b'0',
`year` int(10) NOT NULL DEFAULT '2015',
PRIMARY KEY (`imei`),
UNIQUE KEY `imei_index` (`imei`) USING BTREE,
KEY `imeibatchclientyear` (`imei`,`clientcode`,`batchnum`,`year`),
KEY `batches` (`batchnum`,`clientcode`,`year`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
【问题讨论】:
标签: mysql performance indexing filesort