gpt4 book ai didi

php - Mysql LEFT Join 大数据表

转载 作者:行者123 更新时间:2023-11-29 08:07:20 25 4
gpt4 key购买 nike

我有一个名为“tables_data_info”的表,其中存储了与不同表相关的一些数据。像“创建时间”、“编辑时间”、“编辑用户”、“按用户 ID 创建”等数据。我使用这个表是因为有一个动态 php 脚本会自动生成它。但是,当我有大量记录(在本例中为 15k)时,查询变得非常非常慢,并且需要“分钟”才能完成他的工作!但我并没有选择所有 15k 条记录,我只限制选择 10 条记录!一个简单的查询:

从 zd_products AS pd 中选择 pd.id、pd.title、pd.sell_price、pd.available_qt、tdi.createtime、tdi.lastupdatetime、tdi.create_member_id、tdi.create_group_id、tdi.last_update_member_id、tdi.last_update_group_id LEFT JOIN zd_tables_data_info AS tdi ON ( tdi.targetid = pd.id and tdi.table_name = 'products' ) ORDER by pd.title ASC LIMIT 0, 10

如何以不同方式但更高效地运行此查询?

这里是表结构:

zd_产品

CREATE TABLE `zd_products` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(256) NOT NULL DEFAULT '',
`internalcode` varchar(256) DEFAULT NULL,
`ean13_jan_code` varchar(256) DEFAULT NULL,
`upc_code` varchar(11) DEFAULT NULL,
`active` tinyint(1) NOT NULL DEFAULT '0',
`status` varchar(12) NOT NULL DEFAULT 'new',
`product_tags` longtext,
`buy_price` double NOT NULL DEFAULT '0',
`sell_price` double NOT NULL DEFAULT '0',
`fiscal_tax_id` int(11) NOT NULL DEFAULT '0',
`box_width` double NOT NULL DEFAULT '0',
`box_height` double NOT NULL DEFAULT '0',
`box_depth` double NOT NULL DEFAULT '0',
`box_weight` double NOT NULL DEFAULT '0',
`shipment_extra_price` double NOT NULL DEFAULT '0',
`available_qt` int(11) NOT NULL DEFAULT '0',
`allow_purchase_out_stock` tinyint(1) NOT NULL DEFAULT '0',
`meta_title` varchar(256) DEFAULT NULL,
`meta_description` varchar(256) DEFAULT NULL,
`meta_keywords` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15730 DEFAULT CHARSET=utf8;

zd_tables_data_info

CREATE TABLE `zd_tables_data_info` (
`table_name` varchar(256) NOT NULL DEFAULT '',
`targetid` int(11) DEFAULT NULL,
`create_member_id` int(11) unsigned DEFAULT NULL,
`create_group_id` int(11) unsigned DEFAULT NULL,
`last_update_member_id` int(11) unsigned DEFAULT NULL,
`last_update_group_id` int(11) unsigned DEFAULT NULL,
`createtime` int(11) unsigned DEFAULT NULL,
`lastupdatetime` int(11) unsigned DEFAULT NULL,
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
KEY `INDEX` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19692 DEFAULT CHARSET=utf8;

最佳答案

你的数据不是特别大。这是查询:

SELECT pd.id, pd.title, pd.sell_price, pd.available_qt,
tdi.createtime, tdi.lastupdatetime, tdi.create_member_id, tdi.create_group_id,
tdi.last_update_member_id, tdi.last_update_group_id
FROM zd_products pd LEFT JOIN
zd_tables_data_info tdi
ON tdi.targetid = pd.id and tdi.table_name = 'products'
ORDER by pd.title ASC
LIMIT 0, 10;

您可以使用索引提高此查询的性能。我想到的两个是 zd_products(title, id) 和 zd_tables_data_info(targetid, table_name) 。尝试这些,看看它们是否有帮助。您可以在 create table 语句(或 alter table)中或使用以下方法创建这些索引:

create index zd_products_title_id on zd_products(title, id);
create index zd_tables_data_info_targetid_table_name on zd_tables_data_info(targetid, table_name);

如果没有,请将解释放在您的查询前面,然后使用生成的计划编辑您的问题。

关于php - Mysql LEFT Join 大数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22439186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com