簡體   English   中英

Mysql LEFT加入大數據表

[英]Mysql LEFT Join on big data table

我有一個名為“tables_data_info”的表,其中存儲了一些相對於不同表的數據。 像“創建時間”,“編輯時間”,“編輯用戶”,“按用戶ID創建”等數據。我正在使用此表,因為有一個動態的PHP腳本可以自動生成它。 但是,當我有大量的記錄(在這種情況下為15k)時,查詢變得非常非常慢,並且花費“分鍾”來完成他的工作! 但我沒有選擇所有15k記錄,我只限制選擇10條記錄! 一個簡單的查詢:

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 AS pd 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_products

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);

如果沒有,請將explain放在查詢前面,然后使用生成的計划編輯您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM