我有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
答案 0 :(得分:0)
您是否尝试过从MyISAM类型的表到Innodb?这将有助于负载很多。做一个表的副本并用phpmyadmin转换它。
另外,请确保在表中定义用于带有Index的表达式的行,并且如果可能的话,将值缩减为具有最大值的varchar。
我有一个包含9百万条记录的表,当我们定义索引并确保它不仅是一个键时,它会将查找时间缩短到最小。从3分钟到5秒。
答案 1 :(得分:0)
INDEX(nama_barang)
这样JOIN就可以有效而不是重复的表扫描。
坚持使用InnoDB。
PRIMARY KEY(id)
KEY (id, ...)
不要使用PRIMARY KEY
的列启动辅助密钥。它使关键无用。