你是如果对你的报表进行优化的?

1,你是如果对你的报表进行优化的

 

1.先观察,开启慢查询日志,设置相应的阈值(比如超过3秒就是慢SQL),在生产环境跑上个一天过后,看看哪些SQL比较慢。

2.Explain和慢SQL分析。比如SQL语句写的烂,索引没有或失效,关联查询太多(有时候是设计缺陷或者不得以的需求)等等。

3.Show Profile是比Explain更近一步的执行细节,可以查询到执行每一个SQL都干了什么事,这些事分别花了多少秒。

4、调整索引或语句本身

 

2.索引选择原则

 

1. 较频繁的作为查询条件的字段应该创建索引
2. 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
3. 更新非常频繁的字段不适合创建索引
4. 不会出现在 WHERE 子句中的字段不该创建索引
5. 数据区分不明显的不建议创建索引
如 user 表中的性别字段,可以明显区分的才建议创建索引,如身份证等字段。
 

 

3.什么情况下不走索引

1.正则表达式不使用索引,这应该很好理解,所以为什么在SQL中很难看到regexp关键字的原因 
 
2. 字符串与数字比较不使用索引; 
CREATE TABLE `a` (`a` char(10)); 
EXPLAIN SELECT * FROM `a` WHERE `a`="1" -- 走索引 
EXPLAIN SELECT * FROM `a` WHERE `a`=1 -- 不走索引 
 
 
4.前导模糊查询不能使用索引
如:

select name from user where name like '%zhangsan'
非前导则可以:

select name from user where name like 'zhangsan%'
建议可以考虑使用 Lucene 等全文索引工具来代替频繁的模糊查询。
 
5.负向查询不能使用索引
select name from user where id not in (1,3,4);
应该修改为:
 
select name from user where id in (2,5,6);
 
6.在字段上进行计算不能命中索引
 
select name from user where FROM_UNIXTIME(create_time) < CURDATE();
 
应该修改为:
 
select name from user where create_time < FROM_UNIXTIME(CURDATE());
 
7.最左前缀问题
 
如果给 user 表中的 username pwd 字段创建了复合索引那么使用以下SQL 都是可以命中索引:
 
select username from user where username='zhangsan' and pwd ='axsedf1sd'
 
select username from user where pwd ='axsedf1sd' and username='zhangsan'
 
select username from user where username='zhangsan'
 
但是使用
 
select username from user where pwd ='axsedf1sd'
 
是不能命中索引的。

 
8. 如果明确知道只有一条记录返回
 
select name from user where username='zhangsan' limit 1
可以提高效率,可以让数据库停止游标移动。
 
 
9.不要让数据库帮我们做强制类型转换
 
select name from user where telno=18722222222
这样虽然可以查出数据,但是会导致全表扫描。
需要修改为
 
select name from user where telno='18722222222'
 
10.如果需要进行 join 的字段两表的字段类型要相同
 
不然也不会命中索引。

4 sql优化的几种方法

在sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化,下面总结的一些方法,有需要的可以参考参考。


1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。    
    
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:    
select id from t where num is null    
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:    
select id from t where num=0    
    
3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。    
    
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:    
select id from t where num=10 or num=20    
可以这样查询:    
select id from t where num=10    
union all    
select id from t where num=20    
    
5.in 和 not in 也要慎用,否则会导致全表扫描,如:    
select id from t where num in(1,2,3)    
对于连续的数值,能用 between 就不要用 in 了:    
select id from t where num between 1 and 3    
    
6.下面的查询也将导致全表扫描:    
select id from t where name like '%abc%'    
    
7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:    
select id from t where num/2=100    
应改为:    
select id from t where num=100*2    
    
8.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:    
select id from t where substring(name,1,3)='abc'--name以abc开头的id    
应改为:    
select id from t where name like 'abc%'    
    
    
10.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,    
否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。    
    
    
14.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,    
因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。    
一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。    
    
    
17.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
 

5 什么是索引

1.什么是索引?

索引是帮助MySQL高效获取数据的数据结构。即可以理解为:索引是数据结构。

2.作用是什么?
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容,提高性能(查询速度)。

索引是优缺点:   首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。

MySQL目前主要有以下几种索引类型:

普通索引 。 
是最基本的索引,它没有任何限制.

唯一索引 
与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一.

主键索引 
是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。

组合索引 
指多个字段上创建的索引,只有在查询条件中使用了创建一个字段,索引才会被使用。使用组合索引时遵循最左前缀。

全文索引 
 

2.索引是不是越多越好

答案:是并不是越多越好,原因如下: 
1。虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行插入,更新和删除。因为更新表时,不仅要保存数据,还要保存一下索引文件. 
2。建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会增长很快。索引只是提高效率的一个因素,如果有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值