mysql like语句优化

在一个表中有个1000W条记录。其中一个字段是tags 内容格式是这样的: tag1;tag2;tag3;tag4; 内容格式都是这样的。我想找到tags含有tag3的 如果用like需要全表扫描。我看mysql有个函数FIND_IN_SET,然后我的sql可以写成select * from A where FIND_IN_SET('tag3',REPLACE(tags,';',',')) 但是感觉效率仍然不高。不知道还有什么能优化的吗?数据库表已经定了优化不了了。。。。谢谢各位!

阅读 15k
6 个回答

使用检索引擎吧,比如Sphinx

如果你舍得建一个fulltext索引的话,效率是否会有所提升呢

优化我不清楚,但是应该tag字段应该要分成一张tag表,然后再建立一张中间表对应啊~

我支持 @钱晓朋 的做法,结构重组也属于优化的一种,而且效果很好,就看你怕不怕麻烦了

索引或者重新建表

建立主键或唯一索引, 利用索引(假设每页10条)
---语句样式: MySQL中,可用如下方法: SELECT FROM 表名称 WHERE id_pk > (pageNum10) LIMIT M
---适应场景: 适用于数据量多的情况(元组数上万)
---原因: 索引扫描,速度会很快. 有朋友提出: 因为数据查询出来并不是按照pk_id排序的,所以会有漏掉数据的情况,只能用以下方法

---方法2: 基于索引再排序
---语句样式: MySQL中,可用如下方法: SELECT FROM 表名称 WHERE id_pk > (pageNum10) ORDER BY id_pk ASC LIMIT M
---适应场景: 适用于数据量多的情况(元组数上万). 最好ORDER BY后的列对象是主键或唯一所以,使得ORDERBY操作能利用索引被消除但结果集是稳定的(稳定的含义,参见方法1)
---原因: 索引扫描,速度会很快. 但MySQL的排序操作,只有ASC没有DESC(DESC是假的,未来会做真正的DESC,期待...).

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题