在多个表的Mysql中建立索引

时间:2017-04-07 10:46:25

标签: mysql indexing






我有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; 




1 个答案:

答案 0 :(得分:0)

  • 使用VARCHAR代替CHAR,除非字符串是真正固定的宽度。
  • 永远不要使用FLOAT(m,n),使用FLOAT进行"科学"数量或DECIMAL(m,n)表示确切数量,例如金钱。
  • 在每张桌子上都有一个PRIMARY KEY,最好使用一些自然的桌子。 PK作为唯一的列(或列的组合)。
  • 除非右边的表格是真正可选的,否则不要说LEFT

加速查询的第一步是

INDEX(mainplant)

进行我建议的其他更改,然后我们可以再次优化查询。 (可以通过添加此索引以及PK来解决性能问题 。)