用B树索引的数据库都不能解决这个问题试一试select * from (select * from table_a where title like '文字%') where title like '%文字%' 不知道MYSQL的那个版本支持这个语法
楼上的即使语法可以执行,但select * from table_a where title like '文字%'这样的查询结果也不是符合我的需要啊,还有人能解决这个问题吗?
select * from (select * from table_a where title like '文字%') where title like '%文字%' 先查出like '文字%'的结果,缩小查寻范围后再查like '%文字%' 迁移不会用B树索引的,如果like '文字%'的结果集很小,like '%文字%'查询应该不太慢
select * from table_a where title like '%文字%' '%文字%'里的文字是千变万化的,所以无法建立索引,因而用不到索引用不到索引,所以只能一行一行比较 title 和 '%文字%',因此记录越多,所用时间越慢如果想提高效率,不妨从你的业务逻辑上想办法 比如: 先把范围缩小 select * from table_a where title like '%文字%' and type='技术类' 另外 即使可以建立全文索引,如果是海量数据的话,还应进行分段查询 比较明显的例子可以看看csdn的搜索"2004年前" "2004年"
回复chensiping() :你的想法我也考虑过,但从业务逻辑上整个SQL是这样的,select * from table_a where status='1' and title like '%文字%' 我把status='1' 放在前面大概也只能缩小一半范围,因为status='0'的数据跟等于1的差不多,这样做是远远不够.
没办法解决的! like '%str%' 是不会使用索引的. 可以考虑全文索引.
select * from (select * from table_a where title like '文字%') where title like '%文字%'是为了括号里边的查询能够使用索引,在不改变表结构和查询结果的条件下的实现。这种实现不比改变表结构的status='1'或者type='技术类'更好吗?为什么有些人不理解呢。 以下部分摘自:MySQL手册版本 5.0.20 译者:叶金荣(Email:)出处:http://imysql.cn ---------------------------------------------------------------------------- 大部分MySQL索引(PRIMARY KEY, UNIQUE,INDEX 和 FULLTEXT)都是以B树方式存储。只有空间类型的字段使用R树存储,MEMORY (HEAP)表支持哈希索引。 MySQL在做 LIKE 比较时也可能用到索引,如果 LIKE 的参数是非通配字符开始的固定字符串的话。以下的 SELECT 语句就用到了索引:SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';第一个查询中,只有的 'Patrick' <= key_col < 'Patricl' 记录才会被检索到。第二个查询中,只检索 'Pat' <= key_col < 'Pau' 的记录。以下 SELECT 语句不使用索引:SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE other_col;第一个语句中,LIKE 的参数是以通配符开始的。第二个语句中,LIKE 的参数不是一个常值。
to mu_gua(木瓜): 明白你的意思 能用索引就用索引,用不了也没有办法 你的语句这样写才能表达你的意思 select * from table_a where title like '文字%' union select * from table_a where title not like '文字%' 否则,仅凭这句 select * from (select * from table_a where title like '文字%') where title like '%文字%' 查询结果不符合要求 至于为什么不符合,你可以模拟一些数据来试试.然后再想想iloveyou123()的话.
To chensiping(): 1试试全文索引. MYSQL的全文索引功能我有试过,但是查询结果不令人满意,可能是它本身机制的问题,把一些常出现的词汇都作为断字2加大数据库服务器硬件投入 3用数据库群集 恭喜你,你的项目非常巨大,可以考虑跟百度,google合作 呵呵,项目不大,做这些投入囊中羞涩.....
To chensiping(): 数据量倒是不到,十万级数据量,但关键是每条记录都要对所有记录进行模糊匹配,找出数据库与该条记录的相关记录,这样查询次数相当与是10万*10万次,模糊查询的性能显然是远远不够的. 业务逻辑确实仅仅只能通过status排除不用的记录,其余的记录都需要进行相关性匹配.select * from table_a where title like '文字%' union select * from table_a where title not like '文字%' 那不等于还是全部记录吗?
TO mu_gua(木瓜) :我的表已经是用MyISAM引擎的,并且对MYSQL的环境变量进行过优化
不知道MYSQL的那个版本支持这个语法
先查出like '文字%'的结果,缩小查寻范围后再查like '%文字%'
迁移不会用B树索引的,如果like '文字%'的结果集很小,like '%文字%'查询应该不太慢
人家要的是 %文字% 形式的搜索结果
你的SQL首先就只能查找出 文字% 的结果,缩小了范围,再到里面找 %文字% 有什么意义?
您好,我们是“2006中国杰出数据库工程师评选”活动组委会。
您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
http://www.bestdba.cn/match_discussion.aspx在那里,进入本次评选终选的30位数据库工程师将与您展开积极的互动。他们会为您的问题提供满意的答案,此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。您的帖子位于:
http://www.bestdba.cn/match_discussion3.aspx?pointid=494&pointid2=1&pointid3=5&pcount=stc非常感谢您对本次活动的支持!
--------------------------------------------------------------
'%文字%'里的文字是千变万化的,所以无法建立索引,因而用不到索引用不到索引,所以只能一行一行比较 title 和 '%文字%',因此记录越多,所用时间越慢如果想提高效率,不妨从你的业务逻辑上想办法
比如:
先把范围缩小 select * from table_a where title like '%文字%' and type='技术类'
另外
即使可以建立全文索引,如果是海量数据的话,还应进行分段查询
比较明显的例子可以看看csdn的搜索"2004年前" "2004年"
没办法解决的! like '%str%' 是不会使用索引的. 可以考虑全文索引.
以下部分摘自:MySQL手册版本 5.0.20 译者:叶金荣(Email:)出处:http://imysql.cn
----------------------------------------------------------------------------
大部分MySQL索引(PRIMARY KEY, UNIQUE,INDEX 和 FULLTEXT)都是以B树方式存储。只有空间类型的字段使用R树存储,MEMORY (HEAP)表支持哈希索引。
MySQL在做 LIKE 比较时也可能用到索引,如果 LIKE 的参数是非通配字符开始的固定字符串的话。以下的 SELECT 语句就用到了索引:SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';第一个查询中,只有的 'Patrick' <= key_col < 'Patricl' 记录才会被检索到。第二个查询中,只检索 'Pat' <= key_col < 'Pau' 的记录。以下 SELECT 语句不使用索引:SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE other_col;第一个语句中,LIKE 的参数是以通配符开始的。第二个语句中,LIKE 的参数不是一个常值。
你的数据量有多大啊,提高一倍还不能满足要求?
你的业务逻辑是什么样的,仅仅只能以status来区分?
__________________________解决之道:
1试试全文索引.
如果还达不到要求
2加大数据库服务器硬件投入
如果还不行
3用数据库群集
如果还不行
恭喜你,你的项目非常巨大,可以考虑跟百度,google合作
利用他们的专利技术一定可以解决.
明白你的意思
能用索引就用索引,用不了也没有办法
你的语句这样写才能表达你的意思
select * from table_a where title like '文字%'
union
select * from table_a where title not like '文字%'
否则,仅凭这句
select * from (select * from table_a where title like '文字%') where title like '%文字%'
查询结果不符合要求
至于为什么不符合,你可以模拟一些数据来试试.然后再想想iloveyou123()的话.
1试试全文索引.
MYSQL的全文索引功能我有试过,但是查询结果不令人满意,可能是它本身机制的问题,把一些常出现的词汇都作为断字2加大数据库服务器硬件投入
3用数据库群集
恭喜你,你的项目非常巨大,可以考虑跟百度,google合作
呵呵,项目不大,做这些投入囊中羞涩.....
数据量倒是不到,十万级数据量,但关键是每条记录都要对所有记录进行模糊匹配,找出数据库与该条记录的相关记录,这样查询次数相当与是10万*10万次,模糊查询的性能显然是远远不够的. 业务逻辑确实仅仅只能通过status排除不用的记录,其余的记录都需要进行相关性匹配.select * from table_a where title like '文字%'
union
select * from table_a where title not like '文字%'
那不等于还是全部记录吗?
like %str 不使用索引
not like 不符合 SARG头疼
2. 自己做索引了。
3. 找搜索引擎公司 哈哈
建立一个有索引的 memory 临时表
CREATE TEMPORARY TABLE ..... key ....然后将查询结果插入在临时表的基础上再进行下一步的操作过程完毕之后删除临时表