如何针对超线程查询优化数据库?

时间:2009-10-21 23:13:41

标签: sql mysql optimization indexing

所以我在MySQL中有一个包含字符串的列的数据库表。给定一个目标字符串,我想找到目标中包含子字符串的所有行,即目标字符串是该列的超字符串的所有行。目前我正在使用以下行的查询:

SELECT * FROM table WHERE 'my superstring' LIKE CONCAT('%', column, '%')

我担心这不会扩展。我目前正在做一些测试,看看这是否是一个问题,但我想知道是否有人对替代方法有任何建议。我已经简要介绍了MySQL的全文索引,但这似乎也是为了找到数据中的子字符串,而不是查明数据是否存在于给定的字符串中。

4 个答案:

答案 0 :(得分:1)

您可以使用全文索引创建临时表,并在其中插入“my superstring”。然后,您可以在连接查询中使用MySQL的全文匹配语法与您的永久表。你仍然会在永久表上进行全表扫描,因为你将检查每一行的匹配(你想要什么,对吗?)。但至少“我的超级字符串”将被编入索引,因此它的表现可能会比你现在的表现更好。

或者,您可以考虑从column中选择table并以高级语言执行匹配。根据{{​​1}}中的行数,这种方法可能更有意义。将繁重的任务卸载到客户端服务器(Web服务器)通常可以获胜,因为它可以减少数据库服务器的负载。

答案 1 :(得分:0)

如果您的上划线是网址,并且您想在其中找到子字符串,那么了解您的子字符串是否可以固定在点上会很有用。

例如,你有超弦:

www.mafia.gov.ru www.mymafia.gov.ru www.lobbies.whitehouse.gov

如果您的规则包含“黑手党”并且您希望前2个匹配,那么我所说的不适用。

否则,您可以将您的网址解析为以下内容:['www','mafia','gov','ru'] 然后,查找表格中的每个元素会更容易。

答案 2 :(得分:0)

好吧,答案显示你没有。这种类型的索引通常不可用,如果你想在MySQL数据库中使用它,你需要创建自己的MySQL扩展。我正在追求的另一种方法是在我的应用程序中进行索引。

感谢所有回复的人!

答案 3 :(得分:0)

我使用需要强大的视图创建了一个搜索解决方案,以满足客户的需求。例如:


CREATE TABLE tblMyData
(
MyId bigint identity(1,1),
Col01 varchar(50),
Col02 varchar(50),
Col03 varchar(50)
)

CREATE VIEW viewMySearchData 
as
SELECT 
MyId,
ISNULL(Col01,'') + ' ' +
ISNULL(Col02,'') + ' ' +
ISNULL(Col03,'') + ' ' AS SearchData
FROM tblMyData

SELECT 
t1.MyId,
t1.Col01,
t1.Col02,
t1.Col03
FROM tblMyData t1
INNER JOIN viewMySearchData t2
ON t1.MyId = t2.MyId
WHERE t2.SearchData like '%search string%'


如果他们决定将列添加到tblMyData并且他们希望搜索这些列,则通过将新列添加到“AS SearchData”部分来修改 viewMysearchData

如果他们认为搜索中有两列很多,那么只需通过从“AS SearchData”部分删除不需要的列来修改 viewMySearchData