优化子串查询的Mysql表索引

时间:2009-02-13 17:21:07

标签: sql mysql database indexing

我有一个MySQL索引问题。

我在MySQL中有一个非常大的表(大约100万条记录),其中包含有关文件的信息。我在其上执行的大多数查询涉及文件路径列上的子字符串操作。

这是表ddl:

CREATE TABLE `filesystem_data`.`$tablename` (
                `file_id` INT( 14 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
                `file_name` VARCHAR( 256 ) NOT NULL ,
                `file_share_name` VARCHAR ( 100 ) NOT NULL,
                `file_path` VARCHAR( 900 ) NOT NULL ,
                `file_size` BIGINT( 14 ) NOT NULL ,
                `file_tier` TINYINT(1) UNSIGNED NULL, 
                `file_last_access` DATETIME NOT NULL ,
                `file_last_change` DATETIME NOT NULL ,
                `file_creation` DATETIME NOT NULL ,
                `file_extension` VARCHAR( 50 ) NULL ,
                INDEX ( `file_path`, `file_share_name` ) 
                ) ENGINE = MYISAM 
             };

所以例如,ill有一行file_path,如:

'\\Server100\share2\Home\Zenshai\My Documents\'

我会用

之类的内容提取用户名(本例中为Zenshai)
SELECT substring_index(substring_index(fp.file_path,'\\',6),'\\',-1) as Username
FROM (SELECT '\\\\Server100\\share2\\Home\\Zenshai\\My Documents\\' as file_path) fp

它有点难看,但这不是我现在关注的问题。

我想要一些建议是什么样的索引(如果有的话)可以帮助加速这个类型的查询。欢迎任何其他建议。

感谢。

PS。虽然表变得非常大,但索引有足够的空间。

2 个答案:

答案 0 :(得分:3)

您不能在当前的表格设计中使用索引。

您可以添加一个名为USERNAME的列,使用您在INSERT/UPDATE中使用的表达式填入SELECT触发器,然后搜索此列。

<强> P上。 S。好奇,您的服务器上确实有100 mln+个文件?

答案 1 :(得分:2)

我创建了一个小的(列,而不是记录计数)子表,它将文件路径分解并存储如下:

FK_TO_PARENT    PATH_PART
1               Server100
1               share2
1               Home
1               Zenshai
1               My Documents

然后只需索引PATH_PART。当然,如果父表是100万加,那么这将进入数十亿条记录。