1. 尽量把字段设置为NOTNULL
NOT IN 、!= 等负向条件查询,如果在有NULL值的情况下返回永远为空结果,查询容易出错
将来数据库执行查询操作的时候,数据库不用去额外比较NULL值。
NULL列需要一个额外字节作为判断是否为NULL的标志位,使用NULL时和该列其他的值可能不是同种类型,导致问题。
避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
2. 添加索引
对查询进行优化,要尽量避免全表扫描,首先应考虑在 where & order by & 常用于查询的字段建立索引。
varchar类型的字段,在建立索引的时候最好指定长度,查询有多个条件时,优先使用具有索引的条件像LIKE条件这样的模糊搜索
索引应建立在那些将用于JOIN,WHERE判断和ORDERBY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引(ENUM)
3. 选取最适用的字段属性
对于那些可能值很有限的列,使用tinyint代替VARCHAR,
比如记录移动设备平台,只有两个值:android,ios,那么就可以使用0表示android,1表示ios,这种列一定要写好注释
为什么不用ENUM呢?ENUM扩展困难,比如后来移动平台又增加了一个ipad,那岂不是懵逼了,而tinyint加个2就行,而且ENUM在代码里面处理起来特别奇怪,是当成整形呢还是字符串,一定要在数据库注释或者代码里面写明各个值的含义
对于那些定长字符串,可以使用char,比如邮编,总是5位
对于那些长度未知的字符串,使用varchar
不要滥用bigint,比如记录文章数目的表id字段,用int就行了
4. 不使用 NOT IN 和 <> 操作
NOT IN和<>操作都不会使用索引,将会进行全表扫描。NOT IN可以NOT EXISTS代替,id<>3 则可使用 id>3 or id<3 来代替。
5. 使用连接(JOIN)来代替子查询(Sub-Queries)
因为使用连接查询时,MySQL不需要在内存中创建临时表来完成查询逻辑
6. 优化查询语句
尽量使用简单的查询,避免使用表链接
尽量避免全表扫描,包括但不限于:
where子句条件横真或为空
使用LIKE
使用不等操作符(<>、!=)
查询含义is null的列
在非索引列上使用or
多条件查询时,请把简单查询条件或则索引列查询置于前面
尽量指定需要查询的列,不要偷懒使用select *
使用子查询会创建临时表,会比链接(JOIN)和联合(UNION)稍慢
在索引字段上查询尽量不要使用数据库函数,不便于缓存查询结果
当只要一行数据时,请使用LIMIT 1,如果数据过多,请适当设定LIMIT,分页查询
千万不要 ORDER BY RAND(),性能极低
7. 添加缓存
对于一些常用的数据,比如配置信息等,可以放在缓存中
可以在本地,缓存数据库的表结构
缓存的数据一定要注意及时更新,还有设置有效期
增加缓存务必会增加系统复杂性,一定要注意权衡
8. 将会导致全表搜索的操作
尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描
尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
in 和 not in 也要慎用,否则会导致全表扫描
对于连续的数值,能用 between 就不要用 in , 用 exists 代替 in
在 where 子句中使用参数,也会导致全表扫描,例如: select id from t where num = @num , 修改为: select id from t with(index(索引名)) where num = @num
尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描,例如: select id from t where num/2 = 100 , 修改为 : select id from t where num = 100*2
尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描
不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引
9. 使用merge存储引擎实现分表,将大表拆分为多张小表
10. 速度优先级
CPU运行速度 > 内存访问速度 > 磁盘io访问速度 > 网络请求速度
原文:https://www.cnblogs.com/hsmwlyl/p/10576004.html