Mysql 1、模糊查询 2、联表查询优化
1、模糊查询
-
LIKE
SELECT * FROM ms_fans WHERE nick_name LIKE ‘%demo%’ LIMIT 0,100
like ‘%XX%’ 不能使用索引
like ‘XX%’ 可使用字段索引,查询效率快 -
LOCATE
SELECT * FROM ms_fans WHERE LOCATE(‘demo’,nick_name)>0 LIMIT 0,100
locate同样不能使用索引,40万数据中查询效率与like相差无几
-
POSITION
SELECT * FROM ms_fans WHERE POSITION(‘demo’ IN nick_name) LIMIT 0,100
position同样不能使用索引
除了LIKE 'XX%'可使用索引,查询效率最快,其他几个模糊查询,效率都差不多
2、统计sql优化
前景:
- 以一表为主表,关联其他子表进行统计查询,表数据量大(百万)
- (主表百万) 查询时进行时间排序等系列操作
思路:关联查询时,进行排序等操作,mysql会在联表查询完毕后,进行排序等操作,使用EXPLAIN解析sql,可以看到,查询完毕后,进行时间等排序,还会对主表进行全表扫描,导致sql执行非常慢。
select * from XXX order by XX
单标进行排序查询时,数据量百万级这个sql也很快。
因此,可以在联表查询之前,先根据条件,查询出主表-单表数据作为虚拟表,再进行联表查询
例:
select * from
(select id from table limit 12) as foo
left join table2 tb on foo.XX = tb.XX
使用EXPLAIN sql分析可见,再进行联表查询时,主表不再全表扫描