Mysql优化方案总结

版权声明:转载请标明出处 https://blog.csdn.net/gymaisyl/article/details/85082717

1.建表优化 – 数据库范式

第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。

第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
如电话列可进行拆分—家庭电话、公司电话;

第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。
比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话),这样一个表结构,就存在上述关系。 学号–> 所在院校 --> (院校地址,院校电话)

这样的表结构,我们应该拆开来,如下:

(学号,姓名,年龄,性别,所在院校)–(所在院校,院校地址,院校电话)
ate)操作异常

2.合适的字段的属性

1. 字段的长度,尽可能设置小一点
比如:在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了。同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字段。

2. 减少NULL
应该尽量把字段设置为NOTNULL,这样在将来执行查询的时候,数据库不用去比较NULL值。
但是,InnoDB 使用单独的位 (bit ) 存储 NULL 值 ,所 以对于稀疏数据由有很好的空间效率 。但这一点不适用于MyISAM 。

3.查询方式的优化

1.少用 select * 进行查询
在进行数据的查询或者取出的时候,我们一般很少需要所有数据,所以使用 select * 的方式,会增加web服务器的负担,增加网络传输的负载,查询速度自然就下降 。

2.开启查询缓存
大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。

3.避免在 where 子句中使用 or 来连接
如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num=10 or Name = 'admin'

改为:

select id from t where num = 10
union all
select id from t where Name = 'admin'

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

5. in 和 not in 也要慎用,否则会导致全表扫描

select id from t where num in(1,2,3) X

对于连续的数值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3

很多时候用 exists 代替 in 是一个好的选择:

6. 应尽量避免在 where 子句中对字段进行表达式操作,或者进行函数操作,会导致索引失效而进行全表扫描
select * from users where YEAR(adddate)<2007; ×

select * from users where adddate<‘2007-01-01';

7.避免大数据量返回

这里要考虑使用limit,来限制返回的数据量,如果每次返回大量自己不需要的数据,也会降低查询速度

4.创建索引

这种优化方式我们一直都在悄悄使用,那便是主键索引。有时候我们可能并不在意,如果定义适合的索引,数据库查询性能(速度)将提高几倍甚至几十倍。

1.创建索引,以下情况不适合建立索引

l 表记录太少

l 经常插入、删除、修改的表

l 数据重复且分布平均的表字段

2.复合索引

如果一个表中的数据在查询时有多个字段总是同时出现则这些字段就可以作为复合索引

猜你喜欢

转载自blog.csdn.net/gymaisyl/article/details/85082717