为什么要优化Mysql
-
系统的吞吐量瓶颈往往出现在数据库的访问速度上,
-
随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相 应变慢
-
数据是存放在磁盘上的,读写速度无法和内存相比
如何优化,以及优化的方案
- 设计数据库时:数据库表、字段的设计,存储引擎
- 利用好MySQL自身提供的功能,如索引等
- SQL语句的优化(收效甚微)
- 横向扩展:MySQL集群、负载均衡、读写分离
- 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存)
数据库的设计
- 字段类型的选择,设计规范,范式,常见设计案例
- 原则:尽量使用整型表示字符串
- MySQL内部的枚举类型(单选)和集合(多选)类型
- 原则:定长和非定长数据类型的选择
- 原则:尽可能选择小的数据类型和指定短的长度
- 原则:字段注释要完整,见名知意
- 原则:单表字段不宜过多
存储引擎选择
- Innodb不断完善,从各个方面赶超MyISAM,也是MySQL默认使用的
索引
- 关键字相对于数据本身,==数据量小==
- 关键字是==有序==的,二分查找可快速确定位置
- 普通索引(key),唯一索引(unique key),主键索引(primary key),全文索引(fulltext key)
水平分割和垂直分割
-
水平分割:通过建立结构相同的几张表分别存储数据
-
垂直分割:将经常一起使用的字段放在一个单独的表中,分割后的表记录之间是一一对应关系
-
集群
- 横向扩展:从根本上(单机的硬件处理能力有限)提升数据库性能 。由此而生的相关技术:==读写分离、负载均衡==
数据库查询语句优化
- 避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
- 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
- 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。可以在查询为空的字段上设置默认值为0 这样的查询效率会比设置为null高
- in 和 not in 也要慎用,否则会导致全表扫描,如
select id from t where num in(1,2,3)
改成这样比较好一点
select id from t where num between 1 and 3 - 用 exists 代替 in 是一个好的选择:
select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num) - 尽量避免大事务操作,提高系统并发能力
- 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
- 尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限
- 避免频繁创建和删除临时表,以减少系统表资源的消耗
- 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
- 任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
[文章借鉴] (https://www.nowcoder.com/discuss/150059?type=0&order=0&pos=13&page=0)
网友评论