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:这个值越高,说明查询低效。