数据库和sql优化的几种方式

1.创建索引

创建表就要创建索引,选定的字段要创建索引,不要所有的字段都创建索引,经常查询或经常当where天剑的优先创建索引。

使用索引的好处:查询快

不好的地方是进行insert、update、delete的时候慢,因为索引占磁盘空间。

所以最好的方式是实现读写分离,读的时候有索引,对表进行增删改的时候不设索引

一般都是BTREE索引,索引有单个索引和组合索引:

http://blog.csdn.net/linminqin/article/details/44342205

这个博客有单个索引和组合索引的介绍及优缺。

索引什么时候失效?

索引失效实在使用like语句查询时失效

组合什么时候失效?比如id和name字段是一个组合索引。

1、顺序颠倒时候失效,如where name=value and id = value这是顺序颠倒

2、使用like语句时候失效

3、如果查询时使用id查询索引不失效,使用name查询会失效

(2)sql本身优化

不用*,少用函数和like,不用嵌套语句等

这个博客很详细了:http://blog.csdn.net/jie_liang/article/details/77340905

(3)大表拆小表

①纵向拆分

大表拆小表,比如文章表字段有id/autor/title/content,content是一个大字段,可以单独拆到一张表里.而且content用的时候比较少,所以拆到另外一张表里可以增快查询速度。

 

用户表的id/name/nick_name/age/phone是常用信息在一张表,爱好/描述/地址是不常用信息,拆到另外一张表里

 

②横向拆分

把数据分表拆开,靠代码控制关联。

如果id是int,可以id的数值拆分。

根据日期拆分也可以。

 

我只要玩具的商品,刚开始只展示20条。

横向拆分很少使用。因为有分页和条件、索引等优化,所以几乎很少有人用横向拆分。

 

(4)加冗余字段

不能所有的字段都加成冗余字段,一定是不常变化的字段为冗余字段

优化前:

汽车表:

id,name,汽车的尺寸,汽车颜色,汽车的生产厂家表的id字段

生产厂家表

id,name,地址信息。

 

我需要展示骑车的信息列表,列表展示信息中需要包含生产厂家时,如果left join,效率会低

如果在单表中查询,速度快,

 

我现在对数据库进行添加冗余字段,对数据库数据优化,

 

优化后:

汽车表:

id,name,汽车的尺寸,汽车颜色,汽车的生产厂家表的id字段,厂家的名字

生产厂家表

id,name,地址信息。

 

什么时候可以加冗余字段?什么情况下不可以加呢?

如果这个冗余字段的数据经常改变,就不建议加冗余字段了

 

(5)不创建外键,靠代码和sql控制

安全性要求不是很高,并且数据量很大的时候,可以不需要外键。

银行项目,安全性要求很高的项目是用外键的。

 

用外键会降低插入数据的速度,不用外键靠sql和代码控制完全不影响使用。

 

(6)读写分离

 

(7)数据库参数调优(专业DBA处理)

 

(8)服务器优化(专业运维或项目经理处理)

 

 

mysql常用的有两种引擎

MyISAM引擎是最原始引擎,没有事务,事务控制是在后来添加上的,后来的引擎里有事务控制,这个引擎就是InnoDB。

事务选InnoDB,并发查询的时候,不需要用事务时处理选MyISAM

在不同场景,调用的引擎不一样.

 

设置慢查询日志后,它会自动将慢的sql语句收集起来,然后查看慢的sql语句,针对比较慢的sql进行优化.

开启慢查询:https://www.cnblogs.com/siqi/archive/2012/11/21/2780966.html

 

explain看性能:http://blog.csdn.net/u010061060/article/details/52473244

 

数据库行列转换:

http://blog.csdn.net/sinat_27406925/article/details/77507478

http://blog.csdn.net/aya19880214/article/details/41280893


你可能感兴趣的:(sql)