我有4个表,交易表,客户表,产品表和&植物表。
我每天都会按产品表项目类型查询每日销售情况,并且每天都会按客户要求进行销售。
但是这些查询执行时间非常长(My tran表只有大约2M行)
如何改善数据库的性能?
我按如下方式创建了表格:
Transaction Table :
CREATE TABLE `tran` (
`Plant` CHAR(4) NOT NULL COLLATE 'utf8_bin',
`tdate` DATE NOT NULL,
`InvNo` VARCHAR(10) NULL DEFAULT NULL COLLATE 'utf8_bin',
`Customer` CHAR(8) NOT NULL COLLATE 'utf8_bin',
`ICode` CHAR(8) NOT NULL COLLATE 'utf8_bin',
`RQty` FLOAT(10,2) NULL DEFAULT NULL,
`FQty` FLOAT(10,2) NULL DEFAULT NULL,
`RAmt` FLOAT(10,2) NULL DEFAULT NULL,
`TaxAmt` FLOAT(10,2) NULL DEFAULT NULL,
`TQty` FLOAT(10,2) NULL DEFAULT NULL,
`TAmt` FLOAT(10,2) NULL DEFAULT NULL
)
COLLATE='utf8_bin'
ENGINE=InnoDB
ROW_FORMAT=COMPACT
;
Customer Details Table :
CREATE TABLE `cust` (
`slno` SMALLINT(6) NULL DEFAULT NULL,
`AArea` CHAR(2) NULL DEFAULT NULL,
`Plant` CHAR(4) NULL DEFAULT NULL,
`Customer` CHAR(8) NOT NULL COLLATE 'utf8_bin',
`cName` VARCHAR(50) NULL DEFAULT NULL,
`DOC` DATE NULL DEFAULT NULL,
`L1` VARCHAR(25) NULL DEFAULT NULL,
`L2` VARCHAR(25) NULL DEFAULT NULL,
`L3` VARCHAR(35) NULL DEFAULT NULL,
`SE` CHAR(6) NULL DEFAULT NULL,
`SEName` VARCHAR(35) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPACT
;
Products/Materials Table :
CREATE TABLE `prod` (
`Slno` INT(3) NULL DEFAULT NULL,
`ICode` CHAR(8) NOT NULL,
`IGroup` CHAR(8) NULL DEFAULT NULL,
`IName` CHAR(50) NULL DEFAULT NULL,
`CAT` CHAR(5) NULL DEFAULT NULL,
`IType` CHAR(20) NULL DEFAULT NULL,
`SubType` CHAR(30) NULL DEFAULT NULL,
`Norm` CHAR(20) NULL DEFAULT NULL,
`SKU` CHAR(20) NULL DEFAULT NULL,
`ICat` CHAR(30) NULL DEFAULT NULL,
PRIMARY KEY (`ICode`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPACT
;
Plant Table :
CREATE TABLE `plant` (
`AArea` INT(1) NULL DEFAULT NULL,
`AName` CHAR(50) NULL DEFAULT NULL,
`MainPlant` CHAR(4) NULL DEFAULT NULL,
`Plant` CHAR(4) NULL DEFAULT NULL,
`PName` CHAR(50) NULL DEFAULT NULL,
`ShortName` CHAR(50) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
Select query :
select pc.mainplant,p.cat,p.itype,
sum(if(year(tdate)=2015,tqty,0)) as _2015,
sum(if(year(tdate)=2016,tqty,0)) as _2016
from tran z
left join plant pc on pc.Plant=z.Plant
left join prod p on p.ICode=z.Icode
left join cust c on c.Customer=z.Customer
where pc.mainplant = 'xxxx'
group by pc.mainplant,p.cat,p.itype;

答案 0 :(得分:0)
VARCHAR
代替CHAR
,除非字符串是真正固定的宽度。FLOAT(m,n)
,使用FLOAT
进行"科学"数量或DECIMAL(m,n)
表示确切数量,例如金钱。PRIMARY KEY
,最好使用一些自然的桌子。 PK作为唯一的列(或列的组合)。LEFT
。加速查询的第一步是
INDEX(mainplant)
进行我建议的其他更改,然后我们可以再次优化查询。 (可以通过添加此索引以及PK来解决性能问题 。)