SQL中的最佳LIKE搜索

Mic*_*ray 7 sql optimization search

我有一个零件数据库,我将不断查询报价系统.零件数据库中有1,400,000多条记录.用户只是开始键入部件号,他们希望系统只能在几个字符后找到,所以我需要能够进行通配符搜索,例如:

SELECT NeededFields FROM Parts WHERE PartNumber LIKE 'ML%'
Run Code Online (Sandbox Code Playgroud)

我是否可以执行任何类型的优化以尝试从这种类型的查询中获得最大的性能?我将PartNumber字段编入索引,但我不确定这是否是我能得到的最好的.我愿意考虑将数据库中内置的备用索引结构与SQL索引分开.主键是Guid,但我需要这个用于复制,因为我使用的是特定的数据结构.

Jon*_*ler 4

大多数(好的)优化器都会尝试对通配符不首先出现的 LIKE 子句使用索引。如果模式以通配符开头,那么他们能做的事情就会少得多。

如果索引是 B 树索引,而不是哈希索引(ISAM 系统通常使用 B 树),则可以使用子句的前导字符来约束索引搜索。如果系统使用哈希索引,那么您将无法轻松地处理部分字符串,除非您在第一个字符上创建单独的索引,然后在前两个字符上创建单独的索引,然后在列的前三个字符上创建单独的索引。ISAM 系统可能会为您提供这种灵活性;大多数 SQL 系统都没有,您必须创建 1、2、3、... 字符的列,其中包含零件编号字段的前 1、2、3... 字符。

补充:评论询问“哪个 DBMS?”,这是公平的。我可以保证您可以使用任何版本的 IBM Informix Dynamic Server (IDS) 和 Standard Engine (SE)。我希望 IBM DB2(LUW 或 z/OS)都能做到这一点;我希望甲骨文能够做到这一点。注释表明 PostgreSQL 8.0 及更高版本可以做到这一点 - 需要注意事项。我无法以我自己对 Sybase、Ingres、MS SQL Server、Firebird 或 MySQL 的了解来回答。每个 DBMS 都可能有关于何时可以使用索引的警告。

请注意,如果存在另一个提供选择性的索引,则可以优先使用提供通配符搜索访问权限的索引。