mysql 查询优化

一 库表结构的优化

1 尽量 选择更小,更简单的数据类型
2 尽量避免使用null

数据库三大范式

(1) 每一列都是不可再分的属性值,确保每一列的原子性。
(2) 表中所有列都必须依赖于主键。
(3) 表中的每一列都与主键直接相关。

Mysql schema设计中的陷阱

(1) 范式化与反范式化
严格遵循范式意味着在查询时往往需要表联结,这意味着更大的代价。在实际项目中,要应用范式化和反范式化。
(2) 缓存表与汇总表
缓存表:存储的数据是从其他表中获取的,但是这些数据查询起来很慢。
汇总表:使用group by语句聚合数据的表。
在实际应用中,我们把统计是数据存放在一个预定义的表中,每隔一段时间,对表更新一次,当需要时就可以直接从表中查询到某些数据,满足一些日常业务的需求。

(3) 物化视图
(4) 计数器表

二 索引优化

1 独立的列
独立的列就是索引应该单独使用而不能作为表达式的一部分或函数的参数。
2 前缀索引
在创建前缀索引时,要保证选择足够多的前缀,以保证较高的选择性,同时又不能太长以节约空间。
3 多列索引

三 查询语句优化

1 切分删除
一次删除很多数据时,会锁住大量数据,耗尽系统资源,阻塞很多查询。因此对于影响很多数据的delete语句,切分成多个较小的deletez语句,能够快速完成,大大减小占有锁的时间,降低对mysql性能的影响。
2 分解关联查询
有时候一个大的关联查询,可能会很慢。可以把多个关联查询分解成多个单表查询,然后在应用中对数据进行关联操作。

mysql 查询优化器的限制

https://blog.csdn.net/yangyuge1987/article/details/79401545
(1) 关联子查询
用in()方法加子查询,比如下面sql语句:

Select * from film where film_id in(select film_id from film_actor where actor_id=1);

优化器会把该sql语句改成如下:

Select * from film where exists(select * from film_actor where actor_id=1 and film.film_id=

film_actor.film_id);

由于子查询关联到外部表,需要用到外部表的film_id,因此这个sql无法先执行子查询,只能先执行外部表的查询,找到film_id,根据film_id执行子查询语句。如果外部表数据非常大,那么这个sql执行时间就会很长。因此,使用in()加子查询,性能经常会很低,通常使用exists代替in()来获取更高的效率。
(2) Union的限制
Union的限制外部的条件无法渗入到内层的查询中,如下sql语句:

(Select first_name,last_name from actor order by last_name) union all (select first_name,

last_name from customer order by last_name) limit 20;

假如actor表有200条记录,customer表有900条记录,那么这条sql是扫描出actor的200条记录和customer的900条记录,然后将这些记录放入临时表时,再从临时表中取出前20条记录。可以通过在两个子查询上分别加上limt来减少临时表的数据,见下:

(Select first_name,last_name from actor order by last_name limit 20) union all (select first_name,

last_name from customer order by last_name limit 20) limit 20;
(3) 最大值和最小值计算
Max()与min()方法,mysql优化的不是太好,比如要查找最小的actor_id,如下sql语句:

Selectmin(actor_id) from film_actor;

Actor_id是主键,但是也会做全表扫描。曲线救国的方式,来改变查询提交效率,就是移除min方法,改后的sql语句如下:

Select actor_idorder by desc limit 1;

但是,这条sql语句已经无法表达它的本意了,但是有时候为了获得更高的查询性能,不得不放弃一些原则。
………..

https://www.cnblogs.com/go-onxp/p/oracle.html
索引查询优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值