【问题标题】:Optimizing Mysql Table Indexing for Substring Queries为子字符串查询优化 Mysql 表索引
【发布时间】:2009-02-13 17:21:06
【问题描述】:

我有一个 MySQL 索引问题要问你们。

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

这是 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 
             };

例如,我有一行文件路径如下:

'\\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。尽管表变得非常大,但仍有足够的空间用于索引。

【问题讨论】:

    标签: sql mysql database indexing


    【解决方案1】:

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

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

    P. S. 只是好奇,你的服务器上真的有100 mln+ 文件吗?

    【讨论】:

    • 这不仅仅是一台服务器,而且它根本不是“我的”。但是,是的,实际上更多。
    • 另外,谢谢您的回答。我会尝试一下,花费额外的时间插入以获得更快的查询可能是值得的。
    【解决方案2】:

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

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

    然后只需索引 PATH_PART。当然如果父表超过1亿,那么这将进入数十亿的记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多