首页 > 数据库技术 > 详细

MySQL数据库优化

时间:2019-03-22 10:23:43      阅读:179      评论:0      收藏:0      [点我收藏+]

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访问速度 > 网络请求速度

MySQL数据库优化

原文:https://www.cnblogs.com/hsmwlyl/p/10576004.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!