我有一个表有大约1000W条数据,我有一个sql语句是这样的:
SELECT column_1 FROM table_name WHERE column_2 IN ('A','B') ORDER BY id;
column2这个字段是varchar类型,有索引,id是主键。我这个语句用 EXPLAIN 分析,发现排序用到了 using file sort 。 请问我想实现同样的功能,怎样才能避免 using filesort?
ps: 顺便请问有没有可以系统学习mysql索引优化的书籍,谢谢。
IN 的效率好像不是很高。 如果只有2个值,试试2条SQL语句 看看总时间是多少?
IN
中的条件应该不多吧,去掉order by
试试,它们用了不同的索引。- 不过,上面说的情况,那个
file sort
无关紧要的, 大头在IN
,如果已经使用了索引就没问题了。 - 单表 1000w 这个量,放弃社区版的 MySQL 吧。
不知道
@imhered 两个其实只是举例子,真实的情况可能会有很多
@yszou 去掉order by 就不能排序了啊 而且如果不用order by 只有In 是非常快的,能够用到 column_2上的索引 然鹅就是不能排序
挺不错的
- 我的意思是,去掉
order by
是不是就没有file sort
了。 - SQL 不排序你应用层自己排就是了嘛。
@yszou 是的 去掉orderby 就没有file sort 了
@yszou 这张表有1000W条数据······我应用层排序亚历山大啊·····
有1000w数据应该不代表你需要取出来1000w条嘛,可以评估一下数据量,不大应用层排序没有问题
@Treagzhao
你 IN
之后,哪会有 1000w 条嘛。
mysql这玩具普通开发者没啥可折腾的。商业的用mssql,ora,免费的用pg。早换早解脱
很久没做数据库优化了,你试试复合索引吧<column_2, id>
,不确定是否有用
@yszou 即使有搜索条件 也基本不会少于20W