数据库(sql)优化持续更新

1.优化Limit
原因:limit10000,10      查询的时候会查出10010条数据,然后舍弃前面10000条 返回10条

优化方案:记录上次查询的最后一个id值9999,然后使用sql语句select * from table where id>9999 limit10

3.用in 代替  or
对于连续的数值  能用 between 就不用or

4.尽量避免使用order by

5.避免 select *


7.注意区分 exists in
select * from 表A where id in (select id from 表B)`
上面的语句相当于:
`select * from 表A where exists(select * from 表B where 表B.id=表A.id)

in 内层表先被访问      适合外表大  内表小的
exists(外层表为驱动表) 外层表先被访问   适合外表小 内表大的

8.禁止不必要的order by排序
如果我们对结果没有排序的要求,就尽量少用排序;

如果排序字段没有用到索引,也尽量少用排序;

mysql会对group by字段进行排序,可以使用
SELECT goods_id,count(*) FROM t GROUP BY goods_id    ORDER BY NULL  禁止排序

9.union和union all

union:会对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序(需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟)。

 union all:对两个结果集进行并集操作,包括重复行,不会对结果进行排序

明确不重复的时候,用union all

10.将多次插入换成批量Insert插入

INSERT INTO t(id, name) VALUES(1, 'aaa');`
`INSERT INTO t(id, name) VALUES(2, 'bbb');`
`INSERT INTO t(id, name) VALUES(3, 'ccc');`
—>
`INSERT INTO t(id, name) VALUES(1, 'aaa'),(2, 'bbb'),(3, 'ccc');
11.尽量使用数字型字段
若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能。引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

12.join的优化


13group by的优化

1.创建索引(B+树 快)

2.避免使用select  列出需要查询的列

3.水平拆分(分表,分库,分库分表)和垂直拆分

只分表:


    将db库中的user表拆分为2个分表,user_0和user_1,这两个表还位于同一个库中。适用场景:如果库中的多个表中只有某张表或者少数表数据量过大,那么只需要针对这些表进行拆分,其他表保持不变。


只分库:


    将db库拆分为db_0和db_1两个库,同时在db_0和db_1库中各自新建一个user表,db_0.user表和db_1.user表中各自只存原来的db.user表中的部分数据。


分库分表:


    将db库拆分为db_0和db_1两个库,db_0中包含user_0、user_1两个分表,db_1中包含user_2、user_3两个分表。下图演示了在分库分表的情况下,数据是如何拆分的:假设db库的user表中原来有4000W条数据,现在将db库拆分为2个分库db_0和db_1,user表拆分为user_0、user_1、user_2、user_3四个分表,每个分表存储1000W条数据。


 

垂直拆分:

这里的垂直拆分,指的是将一个包含了很多表的数据库,根据表的功能的不同,拆分为多个小的数据库,每个库包含部分表。下图演示将上面提到的库,拆分为db_user库和db_product库。

另一种说法就是你一个表中的字段(就是列)很多,你每次查询都把不是很需要的列查出来不是浪费性能的吗,你用的不是很多的列可以把它们放到另一个表中。。。。你可以在新建的表中加上id什么的,这样你查询到的时候就能查到了啊。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值