在一个表中有个1000W条记录。其中一个字段是tags 内容格式是这样的: tag1;tag2;tag3;tag4; 内容格式都是这样的。我想找到tags含有tag3的 如果用like需要全表扫描。我看mysql有个函数FIND_IN_SET
,然后我的sql可以写成select * from A where FIND_IN_SET('tag3',REPLACE(tags,';',','))
但是感觉效率仍然不高。不知道还有什么能优化的吗?数据库表已经定了优化不了了。。。。谢谢各位!
在一个表中有个1000W条记录。其中一个字段是tags 内容格式是这样的: tag1;tag2;tag3;tag4; 内容格式都是这样的。我想找到tags含有tag3的 如果用like需要全表扫描。我看mysql有个函数FIND_IN_SET
,然后我的sql可以写成select * from A where FIND_IN_SET('tag3',REPLACE(tags,';',','))
但是感觉效率仍然不高。不知道还有什么能优化的吗?数据库表已经定了优化不了了。。。。谢谢各位!
建立主键或唯一索引, 利用索引(假设每页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,期待...).
5 回答3.2k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
5 回答1.4k 阅读
3 回答1.2k 阅读✓ 已解决
2 回答2k 阅读
3 回答2k 阅读
使用检索引擎吧,比如Sphinx