对mysql优化时一个综合性的技术,只要包括
a 表的设计合理化(3NF)
b 添加适当索引(index)[四种:普通索引 全文索引 主键索引 唯一索引(unique) 全文索引
c 分表技术(水平分割 垂直分割)
d 读写[写:update/delete/add]分离
e 存储过程[模块化编程,可以提高速度]
f 对mysql配置优化[配置并发数my.ini,调整缓存大小]
g mysql 服务器硬件升级
h 定时的去清除不需要的数据,定时进行碎片整理(myisam)
什么样的表才是符合3NF(范式)
表的范式,是首先符合1NF,才能满足2NF,进一步满足3NF
1NF:即表的列具有原子性,不可在分解,即列的信息不能分解,只要数据库是关系型数据,就自动满足1NF.
2NF:表中的记录是唯一的,就满足2NF,通常我们设计一个主键来实现.
3NF:即表中不要有冗余数据,也就是说,表的信息如果能够被推导出来,就不应该单独的设计一个字段来存放.
SQL语句优化
sql语句本身的优化
问题是:如何从一个大项目,迅速的定位执行速度慢的语句(定位慢查询)
1 首先我们了解mysql数据库的一些运行状态如何查询(比如想知道当前mysql运行的时间/一共执行了多少次 select/update/delete.../)
show status;
常用的:
show status like 'uptime'
show status like 'com_select' show status like 'com_insert'/'com_delete'
show [session|global] status like ... 如果你不写[session|global] 默认是session会话,指取出当前窗口的执行,如果想看所有(从mysql启动到现在,则应该用global)
show status like 'connection'; //显示慢查询次数
show status like 'slow_queries';
2 如何去定位慢查询
构建一个大表(400万)`存储过程的构建
默认情况下,mysql认为10秒才是一个慢查询
修改mysql的慢查询
show variables like 'long_query_time';
set long_query_time=1;