mysql查询优化

MySQL的查询优化

1.可以用explain去分析sql

现在建两张表,student 和 student01,每张表有五百万数据.两张表结构和数据一模一样.

mysql查询优化_第1张图片

 表的前7个和后7个数据

mysql查询优化_第2张图片mysql查询优化_第3张图片

无索引 

技巧一:避免select * 查询全部列

情况1:select * from student ;查询所有列大概需要6秒

mysql查询优化_第4张图片

 情况2:select classid from student ;只查一列大概需要大概需要3.6秒mysql查询优化_第5张图片

技巧二:sql的全盘扫描是从第一行数据一直扫描到最后一行.因此在提前知道查询的条数时加个limit n.

情况一:查询第一条数据,大概需要2.4秒

mysql查询优化_第6张图片

 情况二:查询最后一条数据,大概需要2.4秒

 查询第一条和查询最后一条两者时间一样,因为两者都是全盘扫描了.

 情况三:查询第一条数据,加个Limit 1,大概需要0.012s,避免了全盘扫描 

mysql查询优化_第7张图片

有索引

技巧一:给经常被当做搜索条件的列加索引

 情况一:查询第一条数据,大概需要2.4秒

mysql查询优化_第8张图片

情况二:给classid列加个普通索引,大概需要1.5秒

 

 mysql查询优化_第9张图片

技巧二:用like的话尽量把%放后面,如'9%'

 技巧三:有了索引后,避免索引失效

1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null

2.应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。

3. 对于连续的数值,能用 between 就不要用 in 了,如:select id from t where num in(1,2,3)改为select id from t where num between 1 and 3

4.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:select id from t where num/2=100应改为:select id from t where num=100*2

5.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:select id from t where substring(name,1,3)=’abc’ ,name以abc开头的id应改为:select id from t where name like‘abc%’

6.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

今天先写到这里,明天看一下多表查询是什么规律,怎么优化.

你可能感兴趣的:(mysql,数据库)