php - Mysql LEFT Join 大数据表

标签 php mysql sql

我有一个名为“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/

相关文章:

php - Mysqli fetch_assoc 与 fetch_array

php - 输入变量 - 从 MySQL 数据库查询

php - 将图像链接更新为自己的 URL

mysql - UPDATE 语句更新一行中的多个字段

php - 这个复杂的SQL语句怎么写

javascript - 使用 php catch 显示 stripe 中的错误

php - 在 session 过期时将 session 变量保存到数据库

MySQL 查询 Hibernate Criteria

SQL日期转换结果为 "invalid number format model parameter."

php - 提交表单时没有任何反应