mysql类别树搜索

时间:2011-01-11 13:45:06

标签: mysql indexing tree sql-like varchar

我在MySQL 5.1上有以下架构

CREATE TABLE  `mytest` (
  `category` varchar(32) ,
  `item_name` varchar(255)
  KEY `key1` (`category`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

类别列填充了

[:parent_parent_cat_id][:parent_cat_id][:leaf_cat_id]

10000200003000

如果您可以搜索所有下类别:parent_parent_category_id

SELECT * FROM mytest WHERE category LIKE "10000%";

它使用索引key1;

但 我想搜索时如何使用索引:parent_cat_id?

SELECT * FROM mytest WHERE category LIKE "%20000%";

你有更好的解决方案吗?

2 个答案:

答案 0 :(得分:3)

此模型称为materialized path

您只需要在单独的表格中categories并使items引用该表,而不是路径:

SELECT  i.*
FROM    categories c
JOIN    items i
ON      i.category = c.id
WHERE   c.path BETWEEN
        (
        SELECT  path
        FROM    categories ci
        WHERE   ci.id = '20000'
        )
        AND
        CONCAT(
        (
        SELECT  path
        FROM    categories ci
        WHERE   ci.id = '20000'
        ), ':')

答案 1 :(得分:2)

第二个查询不能使用索引。

您没有在问题中明确表示您是否能够对架构进行更改,但是如果可能的话,您应该尝试更改它。要在MySQL中存储heirarchical数据,我建议您先Models for hierarchical data 查看演示文稿Bill Karwin

您可能还希望通过Hierarchical queries in MySQL阅读系列Quassnoi