簡體   English   中英

在多個表的Mysql中建立索引

[英]Indexing in Mysql on multiple tables

我有4個表,交易表,客戶表,產品表和工廠表。

我要按產品表的項目類型查詢每日銷售分組,還按每天查詢按客戶分類的銷售。

但是這些查詢的執行時間非常長(我的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; 

  • 除非字符串是真正固定的寬度,否則請使用VARCHAR而不是CHAR
  • 切勿使用FLOAT(m,n)無論是使用FLOAT對“科學”的數量或DECIMAL(m,n)的確切數量,如金錢。
  • 在每個表上都有一個PRIMARY KEY ,最好使用一些“自然” PK作為唯一的列(或列的組合)。
  • 除非右側表格確實是可選的,否則不要說“ LEFT

加快查詢速度的第一步是

INDEX(mainplant)

進行我建議的其余更改,然后我們可以再次進行優化查詢。 可以通過添加此索引以及PK來解決性能問題。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM