【发布时间】:2018-01-10 17:35:46
【问题描述】:
希望您能允许我挑选您的大脑,以便我在此过程中获得一些知识。 我们有 3 个表 - data_product、data_issuer、data_accountbalance
CREATE TABLE `data_issuer` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`issuer_name` varchar(128) NOT NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB
CREATE TABLE `data_product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`issuer_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `data_product_name_issuer_id_260fec65_uniq` (`name`,`issuer_id`),
KEY `data_product_issuer_id_d07fa696_fk_data_issuer_id` (`issuer_id`),
CONSTRAINT `data_product_issuer_id_d07fa696_fk_data_issuer_id` FOREIGN KEY
(`issuer_id`) REFERENCES `data_issuer` (`id`)
) ENGINE=InnoDB
CREATE TABLE `data_accountbalance` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`nominee_name` varchar(128) NOT NULL,
`beneficiary_name` varchar(128) NOT NULL,
`nominee_id` varchar(128) NOT NULL,
`account_id` varchar(16) NOT NULL,
`product_id` int(11) NOT NULL,
`register_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `data_accountbalance_date_product_id_nominee__7b8d2c6a_uniq` (`date`,`product_id`,`nominee_id`,`beneficiary_name`),
KEY `data_accountbalance_product_id_nominee_id_date_8ef8754f_idx` (`product_id`,`nominee_id`,`date`),
KEY `data_accountbalance_register_id_4e78ec16_fk_data_register_id` (`register_id`),
KEY `data_accountbalance_product_id_date_nominee_i_c3a41e39_idx` (`product_id`,`date`,`nominee_id`,`beneficiary_name`,`balance_amount`),
CONSTRAINT `data_accountbalance_product_id_acfb18f6_fk_data_product_id` FOREIGN KEY (`product_id`) REFERENCES `data_product` (`id`),
CONSTRAINT `data_accountbalance_register_id_4e78ec16_fk_data_register_id` FOREIGN KEY (`register_id`) REFERENCES `data_register` (`id`)
) ENGINE=InnoDB
运行下面的查询时,系统大约需要一个小时才能响应 -
SELECT SQL_NO_CACHE *
from data_product
INNER JOIN `data_issuer` ON (`data_issuer`.`id` = `data_product`.`issuer_id`)
INNER JOIN `data_accountbalance` ON (`data_accountbalance`.`product_id` = `data_product`.`id`)
LIMIT 100000000;
data_issuer 和 data_product 都只有几条 100 条记录,但 data_accountbalance 很大,大约有 15,384,358 条记录。
产生的解释计划如下 -
# id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 简单的 data_product ALL PRIMARY,data_product_issuer_id_d07fa696_fk_data_issuer_id 459 100 1 SIMPLE data_issuer eq_ref PRIMARY PRIMARY 4 pnl.data_product.issuer_id 1 100 1 简单的 data_accountbalance 参考 data_accountbalance_product_id_nominee_id_date_8ef8754f_idx,data_accountbalance_product_id_date_nominee_i_c3a41e39_idx data_accountbalance_product_id_date_nominee_i_c3a41e39_idx 4 pnl.data_product.id 493 100有人可以帮助调整查询,使其不需要一个小时即可运行吗?感谢您对我的任何指点。
【问题讨论】:
-
我认为如果您在 data_accountbalance
.product_id` 列上创建索引,它将被优化 -
@Rams - 我尝试了你的建议,但恐怕没有喜悦。查询仍然需要相同的时间。
-
返回多少行?
-
@RickJames - 查询返回 15,402,355 行
-
@Gayathri - 你将如何处理这么多数据?它会扼杀客户吗?您需要多次运行它吗?如果是这样,为什么?也许有一些方法可以解决真正的目标,而无需重复运行长达一小时的查询。
标签: mysql database-performance query-tuning