mysql数据库优化大方向

优化主要有下几个方面:
1:合理建表(至少达到3NF)
2:建立索引(普通索引,主键索引,唯一索引,全文索引)
3:分表技术(水平分割和垂直分隔)
4:读写分离
5:存储过程(模块化编程可提高速度)
6:对mysql配置优化(最大连接并发数和缓存大小)
7:mysql服务器硬件升级
8:定时清除不需要的数据,定时碎片整理(尤其是MyISAM)


详解如下


一:
1NF数据表中的每一列都是不可分隔的
只要是关系新数据库都满足1NF
2NF数据表中的记录都是唯一的。一般使用设置一个没有业务逻辑的主键。这样就很稳定,一般不会修改。
3NF不含冗余数据列,存在多个数据表时,如果能够推导出来的信息就不要用单独的列存放。
《反3NF : 但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,
就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时
遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就
是增加字段,允许冗余。》
二:
SQL语句
使用show status like '……'可以查询mysql数据库在运行时的一些状态信息

如:
show status like 'uptime'  该服务开启时间
show status like 'com_select'/'com_insert'/'com_delete'/'com_update'执行次数
show status like 'connections'查询连接数‘slow_queries’查询慢查询次数
也可以在status前面加上global即整个服务及的查询或session
是会话级别的查询即一个控制台窗口。当然有一些不需要绘画级别的查询,如连接数等
默认情况下,mysql认为10秒才是一个慢查询.,可以修改
show variables like ‘long_query_time’ ; //可以显示当前慢查询时间
set long_query_time=1 ;//可以修改慢查询时间

建立索引

查询表的索引: 

show index from tablename(\G)
show keys from tablename或desc tablename
my.ini中#Path to the database root
datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/"
给目录下的temp文件夹下都有每一个数据表对应的frm后缀的文件即表结构。MYD数据MYI索引。
由于mysql数据库存储引擎的不同索引的存储方式有所区别
MyISAM允许的索引类型为::BTREE
InnoDB为::BTREE
MEMORY/HEAP::HASH或BTREE

建立主键索引::在建表时建立表及索引或行及索引,也可以在建表后建立索引alter table tb add primary key(id)
建立普通索引::在建表后面建立普通索引create index indexName on table(列1,列2)
建立唯一索引::可以建表时写列级唯一索引,还可以在建表后create unique index indexName on table(列1)
该种索引可以为空或不填。
建立全文索引::只对数据库引擎为MyISAM的数据库可用。mysql自己提供的fulltext针对英文生效->sphinx (coreseek) 技术处理中文
建立表级索引FULLTEXT(title名,body字段)查询时select body from tbname where match(title,body) against('yanayn')
全文索引一个 叫 停止词,  因为在一个文本中,创建索引是一个无穷大的数,因此,
对一些常用词和字符,就不会创建,这些词,称为停止词.select  match(title,body)against
(‘database’);查询该字段在里面出现的可能性。

索引像数据库一样不提供修改,必须先删除在创建。
删除索引:alert table tbname drop index indexname
对于主键可以alert table tbname drop primary key.
如果主键自己有auto_increment属性。那么必须先把该属性改掉。
alert table tbname change id int(6);然后在alert drop即可。否则删除不掉。

数据表的引擎是MyISAM或INNODB时,当执行dml语句时,会重整二叉树,在一定程度上耗时间,
索引本生也会占据磁盘空间。所以建立索引时需谨慎。建立索引的依据是:::::

1较频繁查询的字段建立索引2唯一性太差的不适合建立单独索引,更新频繁的也不适合
不会出现在where里面的字段也不适合建立索引。

使用索引时需要注意::

 explain 可以帮助我们在不真正执行某个sql语句时,就执行mysql怎样执行,这样利用我们去分析sql指令.

1, 对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会被使用

explain select * from dept where loc='aaa'\G

就不会使用到索引

 

2,对于使用like的查询,查询如果是  %aaa不会使用到索引

       ‘aaa%’会使用到索引。

 

比如: explainselect * from dept where dname like '%aaa'\G

不能使用索引,即,在like查询时,关键的 ‘关键字’ , 最前面,不能使用 % 或者 _这样的字符., 如果一定要前面有变化的值,则考虑使用全文索引->sphinx.

 

3.     如果条件中有or,即使其中有条件带索引也不会使用。换言之,就是要求使用的所有字段,都必须建立索引, 我们建议大家尽量避免使用or关键字

 

select * fromdept where dname=’xxx’ or loc=’xx’ or deptno=45

 

4.      如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。否则不使用索引。(添加时,字符串必须’’), 也就是,如果列是字符串类型,就一定要用 ‘’ 把他包括起来.

 

5.      如果mysql估计使用全表扫描要比使用索引快,则不使用索引。

show status like‘Handler_read%’;

大家可以注意:
handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。  handler_read_rnd_next:这个值越高,说明查询低效。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值