2015-10-04 77 views
1

我有9k-20k記錄和使用索引。結果是輸入2分鐘,查詢報告5分鐘。優化查詢,php mysql

當我使用php時,它仍然需要循環每個產品,cz我需要創建一些複雜的報表,所以如果查詢時間增加時它更好。 感謝您的幫助。

MySQL查詢:

EXPLAIN select barang.merk, sum(new.total) 
from barang, 
(
    SELECT 
     master.kode_barang,sum(master.jumlah_satuan_Terkecil) as total 
    FROM 
     master 
    Group by 
     master.kode_barang 
) as new 
where new.kode_barang=barang.nama_barang 
group by barang.merk order by barang.id 

結果:

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 PRIMARY  <derived2> ALL  NULL NULL NULL NULL 85 Using temporary; Using filesort 
1 PRIMARY  barang index NULL id 230  NULL 99 Using where; Using index; Using join buffer 
2 DERIVED  master index NULL id 175  NULL 9158 Using index; Using temporary; Using filesort 

我的結構:

CREATE TABLE IF NOT EXISTS `master` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `tanggal_nota` varchar(25) NOT NULL, 
    `no_nota` varchar(15) NOT NULL, 
    `nama_sales` varchar(60) NOT NULL, 
    `kode_kelurahan` varchar(25) NOT NULL, 
    `nama_customer_master` varchar(60) NOT NULL, 
    `alamat` varchar(100) NOT NULL, 
    `kode_barang` varchar(25) NOT NULL, 
    `jumlah_satuan_terkecil` varchar(15) NOT NULL, 
    `dpp_ppn` varchar(15) NOT NULL, 
    `persen_diskon_hco` int(15) NOT NULL, 
    `harga_hd` int(15) NOT NULL, 
    `value_hd` int(15) NOT NULL, 
    `kode_subkategori` varchar(5) NOT NULL, 
    `id_file` varchar(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `id` (`id`,`tanggal_nota`,`no_nota`,`nama_sales`,`kode_barang`,`jumlah_satuan_terkecil`,`kode_subkategori`,`id_file`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

另一個TABEL是看起來是這樣的:

CREATE TABLE IF NOT EXISTS `barang` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `nama_barang` varchar(100) NOT NULL, 
    `merk` varchar(60) NOT NULL, 
    `kategori` varchar(60) NOT NULL, 
    `principal` varchar(60) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `id` (`id`,`nama_barang`,`merk`,`kategori`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

我的指數

Action Keyname Type Unique Packed Column Cardinality Collation Null Comment 
Edit Edit Drop Drop PRIMARY BTREE Yes No id 9254 A  
Edit Edit Drop Drop id BTREE No No id 9254 A  
tanggal_nota 9254 A 
no_nota 9254 A 
nama_sales 9254 A 
kode_barang 9254 A 
jumlah_satuan_terkecil 9254 A 
kode_subkategori 9254 A 
id_file 9254 A YES 

另一個指標:

Action Keyname Type Unique Packed Column Cardinality Collation Null Comment 
Edit Edit Drop Drop PRIMARY BTREE Yes No id 99 A  
Edit Edit Drop Drop id BTREE No No id 99 A  
nama_barang 99 A 
merk 99 A 
kategori 99 A 

回答

0

你試過從的MyISAM表型的去那邊Innodb的?這將有助於負載相當多。做一份表格的副本,並用phpmyadmin進行轉換。

另外,請確保您定義表格中用於包含索引的表達式的行,並且如果可能,請使用最大值將值縮短到varchar。

我有一張有9百萬條記錄的表格,當我們定義索引並確保它不僅僅是一個鍵時,它會將查找時間縮短到極小值。從3分鐘到5秒。

+0

我使用innodb waait分鐘,我會顯示結構.. –

+0

如果您將它們添加爲索引,那麼會縮短很多。特別是你在MySQL中的種類。 – user2420647

+0

如果您爲kode_barang和jumlah_satuan_Terkecil添加索引 – user2420647

0
INDEX(nama_barang) 

使JOIN高效,而不是重複表掃描。

堅持InnoDB。

PRIMARY KEY(id) 
KEY  (id, ...) 

請勿使用PRIMARY KEY的列開始次級密鑰。它使關鍵無用。