a、索引:顺序排列,可以配合pt-index-usege工具来查看索引情况
建立联合索引谁的离散度越高谁就在前面;减少重复及冗余索引;
b、count(*):包含空值 count(某一列):不包含null
例:在一条sql中同时查出2006年和2007年电影的额数量
select count(year='2006' or NULL) as '2006年电影',count(year='2007' or NULL) as '2007年电影' form table
c、子查询:最好用join,不要忘记去重distinct
例:select distinct t.id from t join t1 on t.id = t1.id
d、group by:group by可能会出现临时表(Using temporary),文件排序(Using filesort)等,影响效率。
可以通过关联的子查询,来避免产生临时表和文件排序,可以节省io
e、limit 10,5:查询出10行后的5行
f、数据结构优化:选择合适的数据类型
g、数据库范式
第三范式:不存在非关键字段对任意候选关键字段的传递函数依赖关系,解决方法:建立子表。比如:name-->分类-->分类描诉
不符合第三范式要求的表存在以下问题:
1.数据冗余:(分类、分类描述)对于每一个商品都会进行记录
2.数据插入异常
3.数据更新异常
4.数据删除异常
反范式化:为了查询效率的考虑,把原本符合第三范式的表适当增加冗余,以达到优化查询效率的目的。以空间换取时间的操作
h、垂直拆分:解决表列宽度问题
1.不常用的字段一个表;
2.常用字段一个表;
3.大字段一个表;
i、水平拆分:解决数据量大的问题
1.每个水平拆分表的结构完全一致
2.拆分方式:取模
j、Mysql 数据库的系统参数优化,对现在64位系统来说不是很重要
1./etc/sestatus.conf -->网络方面的配置:增加tcp支持的队列数;减少断开连接时资源回收
2./etc/security/limits.conf -->打开文件数的限制
3.关闭mysql服务器防火墙软件,如:iptables,selinux等,减少服务器压力。防火墙放在硬件上操作。
h.mysql优化配置文件:my.ini
innodb_buffer_pool_size:配置Innodb的缓冲池大小,一般为75%;
innodb_buffer_pool_instances:控制缓冲池的个数
innodb_log_buffer_size:缓冲的大小,由于日志最长每秒就会刷新所以一般不用太大
innodb_flush_log_at_trx_commit:默认值为1,可以取0/1/2 三个数值;一般建议设为2;性能要求高的话,则使用默认值1
innodb_read_io_threads、innodb_write_io_threads:决定Innodb读写的IO进程数,默认为4
innodb_file_per_table:控制Innodb每一个表使用独立空间。默认为OFF-->使用共享表空间;ON-->独立表空间
有利于表删除收回表空间,提高读写的效率
innodb_stats_on_metadata:决定mysql在什么情况下会刷新innodb表单的统计信息。建议为off,很多不必要的刷新影响表相应效率
i、mysql第三方配置工具
https://tools.percona.com/wizard-->Percon configuration wizard