MySQL二叉树选择查询优化

时间:2019-06-14 13:08:40

标签: mysql sql mysql-error-1064

我有一个帐户表。每次创建帐户时,我都会将treeRight ID和treeLeft ID推入account_device_tree表中。

现在我的第一个上级帐户下有超过1000万个帐户。当我选择所有子accouts时,要花费超过一分钟的时间。

我的查询如下

select * 
FROM
    accounts acc 
        JOIN
    account_device_tree ON acc.tree_id = account_device_tree.tree_id
WHERE
(acc.account_id = 1 OR (account_device_tree.tree_left >= 1 AND account_device_tree.tree_right <= 748534))

我需要尽可能地优化。

account_device_tree的架构

CREATE TABLE `account_device_tree` (
  `tree_id` int(11) NOT NULL AUTO_INCREMENT,
  `tree_left` int(11) NOT NULL,
  `tree_right` int(11) NOT NULL,
  PRIMARY KEY (`tree_id`),
  KEY `tree_left` (`tree_left`),
  KEY `tree_right` (`tree_right`)
) ENGINE=InnoDB AUTO_INCREMENT=388173 DEFAULT CHARSET=latin1

帐户表架构

 CREATE TABLE `accounts` (
  `account_id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) NOT NULL,
  `name` varchar(64) NOT NULL,
  `tree_id` int(11) NOT NULL,
  PRIMARY KEY (`account_id`),
  UNIQUE KEY `tree_id` (`tree_id`),
  KEY `name` (`name`),
  KEY `idx_parent_id` (`parent_id`)
) ENGINE=InnoDB AUTO_INCREMENT=389739 DEFAULT CHARSET=latin1

1 个答案:

答案 0 :(得分:1)

很难建议一些没有表结构和查询计划的东西。 但是,假设表中有正确的索引,将查询重新写到UNION ALL中而不是使用OR往往会优化。

select * 
FROM
    accounts acc 
        JOIN
    account_user_device_tree ON acc.tree_id = account_user_device_tree.tree_id
WHERE
  acc.account_id = 1 

UNION ALL

select * 
FROM
    accounts acc 
        JOIN
    account_user_device_tree ON acc.tree_id = account_user_device_tree.tree_id
WHERE
   account_user_device_tree.tree_left >= 1
 AND
  account_user_device_tree.tree_right <= 748534