mysql之优化语句(二)

2014-11-24 11:24:06 · 作者: · 浏览: 1
索引myind
explain select * from dept where loc=‘MsBDpMRX’\G; 不会显示使用到了索引myind
--对于使用like的查询
explain select * from dept where dname like ‘%rjTUPqjZvf’\G; 不会显示使用到了索引myind
explain select * from dept where dname like ‘rjTUPqjZvf%’\G; 会显示使用到了索引myind
--如果条件中有or,即使其中有条件带索引也不会使用
--为了演示,我们把复合索引删除,然后只在dname上加入索引.
alter table dept drop index myind www.2cto.com
alter table dept add index myind (dname)
explain select * from dept where dname=‘aaa’ or loc=‘aa’\G;//就不会使用到dname列上的
--如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。否则不使用索引
select * from dept from dname=1234\G //不会使用到索引
select * from dept from dname=‘1234’\G //会使用到索引
查看索引的使用情况show status like ‘Handler_read%’; handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。
handler_read_rnd_next:这个值越高,说明查询低效。
有些情况下,可以使用连接来替代子查询。因为使用join,MySQL不需要在内存中创建临时表。
如果想要在含有or的查询语句中利用索引,则or之间的每个条件列都必须用到索引,如果没有索引,则应该考虑增加索引
MyISAM 在插入数据时,默认放在最后.,删除数据后,空间不回收.(不支持事务和外键)
InnoDB支持事务和外键
在精度要求高的应用中,建议使用定点数来存储数值,以保证结果的准确性
create table temp1( t1 float(10,2), t2 decimal(10,2));
insert into temp1 values(1000000.32,1000000,32); 发现 t1 成了 1000000.31 所以有问题.
对于存储引擎是MyISAM的数据库,如果经常做删除和修改记录的操作,要定时执行optimize table table_name;功能对表进行碎片整理。 www.2cto.com
create table temp2( id int) engine=MyISAM;
insert into temp2 values(1); insert into temp2 values(2); insert into temp2 values(3);
insert into temp2 select * from temp2;--复制
delete from temp2 where id=1; 发现 该表对于的数据文件没有变小
定期执行 optimize table temp2 发现表大小变化,碎片整理完毕
&&对于InnoDB它的数据会存在data/ibdata1目录下,在data/数据库/只有一个 *.frm表结构文件.
如果一个表的记录数太多了,如果我拆成100个表,那么每个表只有10万条记录。一个好的拆分依据是 最重要的。UNION
有些表记录数并不多,可能也就2、3万条,但是字段却很长,表占用空间很大,检索表时需要执行大量I/O,严重降低了性能。这个时候需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。 (JOIN)
作者 ljfbest