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