left join的话效率一般取决于左表的规模,所以你必须确保左表能有高效率的扫描,尽可能保证左表为索引扫描而非全表扫,当然你的问题并非索引问题,光一个like 中文数据就够你研究的了。 like 'sss%' 这样才有可能用到索引,但是'sss%'并不服合你当前的需求,并不能正确搜出你的预想数据,改用fulltext类型使用全文索引又不支持中文,且即使是英文也有一些配置上的问题需要解决,可以的话你可以用用sphinx
贴出你的语句和 explain select ..的结果。
on(a.id=b.id and a.id=c.id)
我也遇到这个问题,有两种解决办法 第一种:分两次查询,生成两个结果集。等到加载数据的时候,利用缓存匹配(我用的DatabTable,很好查找,匹配) 第二种:看到网上的方法,也是我推荐采用的,联接查询换成关联子查询。速度的确快乐很多 原先Sql SELECT * FROM (...子查询....)A LEFT JOIN (...子查询....)B ON A.键 = B.键 更改后Sql SELECT A.*, (SELECT B.B1+'*#*'+B.B2+'*#*'+B.B3+'*#*')BColumn FROM (....子查询...)A 说明下:由于关联子查询只能返回一个值,所已我把B表每一列组合起来,加载的时候再去解析。 第一种方法不好的地方在于,如果B表数据量很大,10万条。我想通过内存去匹配,加载的时候也会很卡(虽然不再与数据库打交道了)
like 'sss%' 这样才有可能用到索引,但是'sss%'并不服合你当前的需求,并不能正确搜出你的预想数据,改用fulltext类型使用全文索引又不支持中文,且即使是英文也有一些配置上的问题需要解决,可以的话你可以用用sphinx
第一种:分两次查询,生成两个结果集。等到加载数据的时候,利用缓存匹配(我用的DatabTable,很好查找,匹配)
第二种:看到网上的方法,也是我推荐采用的,联接查询换成关联子查询。速度的确快乐很多
原先Sql
SELECT * FROM
(...子查询....)A
LEFT JOIN
(...子查询....)B ON A.键 = B.键
更改后Sql
SELECT A.*,
(SELECT B.B1+'*#*'+B.B2+'*#*'+B.B3+'*#*')BColumn
FROM (....子查询...)A
说明下:由于关联子查询只能返回一个值,所已我把B表每一列组合起来,加载的时候再去解析。
第一种方法不好的地方在于,如果B表数据量很大,10万条。我想通过内存去匹配,加载的时候也会很卡(虽然不再与数据库打交道了)