优化sql语句的一般步骤:
1.通过show status like 'Com_%';了解各种sql的执行频率
2.通过explain分析sql的执行计划:
explain select * from student where studentname='吴笑笑'\G;
其中有rows行,表示扫描行的数量,本例中为2,即扫描2行。
3.确定问题并采取相应的优化策略
在student表上创建索引:
create index name on student(StudentName);
在执行:explain select * from student where studentname='吴笑笑'\G;
rows行变为1了,可见索引提高了搜索效率
索引问题:
索引的存储分类:
MyISAM和InnoDB目前只支持btree索引,mysql目前不支持函数索引,但是能对列的前卖弄某一部分进行索引,例如name字段,可以只取那么的前4个字符进行索引,create index index_name on table_name(name(4))
使用索引:
1.对于创建的多列索引,只要查询条件用到了最左边的列,索引一般就会被使用
2.使用like的查询,后面如果是常量并且只有%号不在第一个字符,索引会被使用。
3.如果列名是索引,使用column_name is null将使用索引。
存在索引但是不使用索引:
1.如果mysql估计使用索引比不使用索引慢,则不使用索引
2.如果使用mymory/heap表,并且where条件中不使用“=”进行索引列,那么不会用到索引
3.使用or分隔的条件,如果or前的条件中的列有索引,而后面的列没有索引,那么索引就不会被使用
4.如果列类型是字符串,那么一定要记得在where条件中把字符串用引号括起来。
查看索引使用情况:
show status like 'Handler_read%'
如果索引正在使用,handler_read_key的值将很高,如果很低表名增加索引得到的性能并没有改善,因为索引不经常使用
handler_read_rnd_next:的值高就意味着查询运行低效,要建立索引补救
两个使用的而优化方案:
定期的分析表和检查表
analyze table table_name;
check table table_name;
定期优化表:
optimize table table_name
常用的sql优化:
1.大批量插入数据:
对于MyISAM表:
alter table table_name disable keys;
load the data(load data file '/home/wuxiaoxiao/1.txt' into table table_name)
alter table table_name enable keys;
对于InnoDB表:
a.将导入的数据按照主键的顺序排列好
b.在导入数据前执行set unique_checks=0关闭唯一性校验
在导入数据之后执行set unique_checks=1
c.导入前执行set autocommit=0
导入之后执行set atocommit=1
2.优化group by:如果查询包括group by但是用户想要避免排序结果的消耗,可以指定order by null
使用sql提示:
1.use index:在查询语句后面添加use index来提供希望mysql去参考的索引列表
select * from student use index (name) where studentid=1;
2.ignore index:忽略索引
select * from student ignore index(name) where studentid=1;
3.force index:强制使用索引:
select * from student force index(name) where studentid>0;
阅读(598) | 评论(0) | 转发(0) |