mysql语句优化
请问下面这句mysql查询语句怎么优化提高查询速度,括号里面的数字字段是可变的。
select id,p_name,small_pic from je_model_sync where all_number_category in ('2528-316-2-0', '421-316-2-3', '421-316-0-0', '2528-316-2-2', '2528-316-1-1', '421-316-4-4', '421-316-5-5', '2528-316-4-1', '421-316-5-3', '2528-316-0-0', '2528-316-2-1', '2589-316-2-3', '2589-316-2-1', '2528-316-0-1', '2589-316-3-1') and (small_classification_sort <=2) order by rand() limit 15
我的数据库all_number_category是一个分类,大概有一万个,每个类名就如“2528-316-2-0”这个,是一个字符串。small_classification_sort其实是每个类名通过权重系数计算的前两个。一个类有的可能有几千张,有的可能就一两张,就是想把每个类的前两张取出来。
建议如下:
1、表je_model_sync中的all_number_category创建索引。
2、sql进行改写,使用union来改写,以in查询为例,可以做如下调整:
select id,pname,small_pic from je_model_sync where all_number_category = '2528-316-2-0'
union
select id,pname,small_pic from je_model_sync where all_number_category = '421-316-2-3'
union
select id,pname,small_pic from je_model_sync where all_number_category = '421-316-0-0'
union
...
这样的坏处可能是sql会比较长,但是加了索引后,查询效率会有很大提升。
3、mysql8.0以后可以使用with as语句来进行临时表查询,参考语法如下:
with e as (select '55' as ad from dual)
select * from biz_student t where t.address = e.ad;
这样的话,sql能大量的减少,不过在8.0以下的mysql暂时不支持这种语法。
以上方式希望对您有用。
1、all_number_category这个字段加上索引,
2、排序的字读也可以加上索引。
加索引要看字段值的重复度,比如性别字段,男、女,加上索引不但不能提供效率,反而浪费了存储,降低查询效率
在mysql中where后面的条件是从左往右执行的(Oracle从右往左),所以把过滤数据量大的条件放左边先执行。所以除了对这两个字段添加索引外,你还可以把(small_classification_sort <=2)放到all_number_category in前面。
我的数据库all_number_category是一个分类,大概有一万个,每个类名就如“2528-316-2-0”这个,是一个字符串。small_classification_sort其实是每个类名通过权重系数计算的前两个。一个类有的可能有几千张,有的可能就一两张,就是想把每个类的前两张取出来。