mysql优化

数据库优化:

1:表的设计合理化(符合3NF)
2:添加适当索引(index)(四种:普通索引,主键,unique,全文索引,空间索引,复合索引)
3:分表技术(水平分割、垂直分割)
4:读写分离
5:存储过程,dbms(数据库管理系统,编译–执行–缓存),直接编程写存储过程(分页存储过程、触发器)存储过程(编译好),模块化编程,
6,对mysql配置优化(配置最大并发数,默认100,调到1000左右,占内存,不宜太大)
7、mysql服务器硬件升级
8、定时清除不需要数据,定时进行碎片整理()

什么样的表才是符合3NF(范式)

表的范式
第一范式:1NF是对属性的原子性约束,要求属性(列)具有原子性,不可再分解;只要是关系型数据库都满足1NF
第二范式:2NF是对记录的唯一性约束,要求记录有唯一标识符,即实体的唯一性
第三范式:3NF是对字段冗余性的约束,它要求字段没有冗余。没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是;在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。

sql语句本身的优化

如何从一个大项目中,迅速的定位执行速度慢的语句(定位慢查询)
1,首先我们了解mysql数据库的一些运行状态如何查询。
show status
常用的
show status like ‘uptime’(数据库的运行时间,持续多少时间)
show status like ‘com_select’(一共执行了多少次select/com_updata/com_delete..)
show [session | global] stauts like ‘com_insert’(session退出后再查询清零,global不会)
show status like ‘connections’查询有几个连接数据库
show status like ‘slow_queries’
如何修改mysql的慢查询默认时间:
1、显示慢查询时间:show variables like ‘long_query_time’
2、设置慢查询时间:set long_query_time=1
3、修改命令结束符:delimiter $$,默认是“;”分号
4、显示慢查询个数:show status like ‘slow_queries’(语句执行时间超过1秒会统计到)
5、如果把慢查询的sql记录到我们的一个日志中在默认情况下,我们的mysql不会记录慢查询,需要在启动mysql时候,指定记录慢查询才可以。(bin\mysqld.exe –safe-mode –slow-query-log)
先关闭mysql再启动,如果启用慢查询日志,默认把这个文件放在my.ini 文件中记录的位置
path to the database root
datadir=”C:/Documents and Setting/All Users/Application Data/MySQL/MySQL Server 5.5/Data/”
重启得再设置慢查询时间

优化问题
通过explain语句可以分析,mysql如何执行你的sql语句

索引

四种索引:主键索引、唯一索引、全文索引、普通索引
添加索引:
1主键索引、当一张表,把某个列设为主键的时候,则该列表就是主键索引 ,如果创建表时没设置主键,可以在创建后添加,指令:alter table 表名 add primary key (列名);
2普通索引: 创建表后添加普通索引,
create index 索引名 on 表(列)
复制数据库后要重新创建索引
内部二叉树算法,索引文件
3创建全文索引
主要针对文件,文本的检索,比如文章,全文索引针对MyISAM有用

正确用法:select * from 表名 where match (字段..) against(’索引对象’);

fulltext 索引只针对 myisam生效
针对英文,sphinx(coreseek)技术处理中文
全文索引一个叫停止词,因为在一个文本中,创建索引是一个无穷大的数,因此,对一些常用词和字符,就不会创建
4唯一索引
当表的某列被指定unique约束时,这列就是唯一索引
unique字段可以为null,并可以有多个,如果是空字符串不能重复
主键字段,不能为null,也不能重复
可以创建表时创建唯一索引,可以在创建后
create unique index 索引名 on 表名(列名)

查询索引: desc表名,缺点不能够显示索引名
show index form 表名
show keys from 表名

删除索引:
alter table 表名 drop index 索引名
删除主键索引:alter table 表名 drop primary key
修改索引:
一般先删除再重新创建
索引注意事项:磁盘占用,磁盘索引文件,dml(updata delete insert)语句的效率影响,因为要维护索引文件,每增删插入二叉树文件要重整。
btree方法检索,次数logn次
引擎:
myisam 允许BTREE ,不支持事务,速度快末尾插入,全文索引,表锁,不支持外键
innodb 允许BTREE,支持事务,速度低,不支持全文索引,行锁,支持外键
memory/heap(同一种引擎) 允许HASH,BTREE,速度极快,存储内存中,不需要入库
在哪些列上适合添加索引
较频繁的作为查询条件字段应该创件索引;
唯一性太差不适合单独创建索引,即使频繁作为查询条件;
更新(变化)非常频繁的字段不适合创建索引;比如在线状态
不会出现在WHERE 子句中字段不该创建索引。
1对于创建的多列索引,只要查询条件使用了最左端的列,索引一般就会使用。
2对于使用like的查询,查询如果是‘%aaa’不会用到索引,关键词最前面不能使用%或者_这样的字符,如果一定要前面有变化的值,则考虑使用全文索引->sphinx
3如果条件中有or,即使其中有条件带索引也不会使用,换言之,就是要求使用的所有字段,都必须建立索引

诀窍

group by 后面增加order by null 可以防止排序
如果你的数据库的存储引擎是myisam,请一定记住定时进行碎片整理,optmize table 表名。

备份数据库(表):mysqldump -u root -proot 数据库 [表名1 表名2] (实际没中括号)> 文件路径(文件)
使用备份文件恢复数据:mysql控制台source 路径(文件)
未完待续..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值