MYSQL - 加入三个大表

时间:2014-03-14 14:44:52

标签: mysql join limit

我想在MySQL中执行这个查询:

SELECT `id`, `state`, `city`, `company`, `manager`, `district`, `group`, `subgroup` FROM `data_table` WHERE `id` IN ( 
SELECT DISTINCT `dataID` FROM `tags_data` WHERE `table` = 'data_table' AND `tagID` IN ( 
    SELECT `id` FROM `tags` WHERE `tag` LIKE '%fruit%' 
) LIMIT 0, 20 );

但MySQL 5.5不支持INLIMIT命令!

#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' 

所以我必须使用INNER JOINLEFT JOIN并合并这些表才能使用LIMIT

但我的问题是这些表是BIG TABLES,每个页面可能会多次使用此查询!所以查询时间的成本对我来说很重要!

我知道这个问题可能重复,但我感到困惑。

2 个答案:

答案 0 :(得分:2)

你可以摆脱你的子查询并使用join子查询将为每一行运行run所以它可能会花费你代替它们,然后使用适当的索引,只选择你需要的列

SELECT 
DISTINCT
  d.`id`,
  d.`state`,
  d.`city`,
  d.`company`,
  d.`manager`,
  d.`district`,
  d.`group`,
  d.`subgroup` 
FROM
  `data_table`  d
  JOIN `tags_data` td ON (d.id =td.dataID) 
  JOIN  `tags`  t ON (t.id =td.`tagID`)
  WHERE td.`table` = 'data_table' AND t.`tag` LIKE '%fruit%'
  LIMIT 0, 20 

索引

ALTER TABLE `tags_data` ADD INDEX `indexname1` (`dataID`); 
ALTER TABLE `tags_data` ADD INDEX `indexname2` (`tagID`); 

或者您可以加入具有限制的表格,以及条件WHERE td.表格= 'data_table'可用于加入查询

JOIN 
(select dataID from `tags_data` WHERE `table` = 'data_table' limit 0,20)
 td ON (d.id =td.dataID)

答案 1 :(得分:1)

thanx到M Khalid Junaid,我使用了这样的查询:

SELECT dataTable.`id`, dataTable.`state`, dataTable.`city`, dataTable.`company`, dataTable.`manager`, dataTable.`district`, dataTable.`group`, dataTable.`subgroup`
    FROM `data_table` AS dataTable
    JOIN `tags_data`
    ON dataTable.`id`=`tags_data`.`dataID`
    JOIN `tags`
    ON `tags_data`.`tagID`=`tags`.`id`
    WHERE `tags`.`tag` LIKE '%friut%' AND `tags_data`.`table`='data_table'
    LIMIT 0, 20;

并且表现可以接受。