优化查询,php mysql

时间:2015-10-04 09:31:28

标签: php mysql query-optimization

我有9k-20k记录并使用索引。结果是输入2分钟,查询报告5分钟。

当我使用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 ;

另一个表格如下所示:

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

2 个答案:

答案 0 :(得分:0)

您是否尝试过从MyISAM类型的表到Innodb?这将有助于负载很多。做一个表的副本并用phpmyadmin转换它。

另外,请确保在表中定义用于带有Index的表达式的行,并且如果可能的话,将值缩减为具有最大值的varchar。

我有一个包含9百万条记录的表,当我们定义索引并确保它不仅是一个键时,它会将查找时间缩短到最小。从3分钟到5秒。

答案 1 :(得分:0)

INDEX(nama_barang)

这样JOIN就可以有效而不是重复的表扫描。

坚持使用InnoDB。

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

不要使用PRIMARY KEY的列启动辅助密钥。它使关键无用。