sql | leecode 1147 |即时事务配送II | sql 优化

sql 有时候还是挺有意思的,有时候不只是crud
下面来看一道sql 题,第一个题解能跑完,但是超时

浮躁的人总是很难看的进去,有时候孤单又在所难免,所以啊 要继续坚持,原来中学老师讲的那句,要耐住寂寞,是任何时候适用

首先要 确定一个用户是在首单完成即时订单的,然后统计所有用户

sql 复制代码
select round(order_date = customer_pred_delivery_date) / count(*) *100 , 2) as immediate_percentage
from Delivery as d
where (customer_id , order_date) in 
(select customer_id, min(order_date) from Delivery gtoup by customer_id);
bash 复制代码
# 用join 代替子查询
#  为什么join 会比多次 查询效率高呢?
#  join 会把多张表整合,然后一次扫描处理所有的表,而多次查询会进行多次扫描,多次IO操作

#可读性提高了,那么维护性也自然提高了。 使用join明显的可以清晰的表达查询意图和逻辑,易于阅读和理解
#然后扩展性也提高了,join 操作上面也讲了,可以方便添加更多的连接条件和连接表,实现更复杂的查询逻辑。
sql 复制代码
select round(sum(order_date) = customer_pref_delivery_date) / count(*) *100 ,2) as immediate_percentage
from Delivery as d 
join(select customer_id, min(order_date) as min_order_date from Delivery group by customer_id) as min_dates on d.customer_id = min_dates.customer_id and d.order_date = min_dates.min_order_date;

贴张图,讲一下常见都有哪些优化

bash 复制代码
# 优化sql 的常见方式有:
#1.选合适的字段属性,从分配的空间、到采用数值型数据替代文本数据,如省份、性别
#2.使用join 替代 子连接  原因上面也已经讲了。
#3.使用union 替代手动创建临时表
#4.事务,怎么理解呢?就像使用命令的时候  同时 && 必然前面出现意外后面的语句是无法执行的,当sql复杂起来,比如设计子查询、连接、联合等,把系列的sql语句用一条或者几条sql 处理 
BEGIN;
  INSERT   INTO   salesinfo   SET   customerid=14;
  UPDATE   inventory   SET   quantity =11   WHERE   item='book';
COMMIT;
begin 表示开始,commit 表示结束。
#5. 锁定表  又挺矛盾的,需要事务,但是又认为开销大,所以上表
尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能,尤其是在很大的应用系统中。由于在事务执行的过程中,数据库将会被锁定,因此其它的用户请求只能暂时等待直到该事务结束。如果一个数据库系统只有少数几个用户来使用,事务造成的影响不会成为一个太大的问题;但假设有成千上万的用户同时访问一个数据库系统,例如访问一个电子商务网站,就会产生比较严重的响应延迟。
#6.使用外键
锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。
#优化索引
#优化查询语句
相关推荐
qq_2131578911 分钟前
(c#)unity中sqlite多线程同时开启事务会导致非常慢
数据库·sqlite·c#
北极无雪17 分钟前
Spring源码学习(拓展篇):SpringMVC中的异常处理
java·开发语言·数据库·学习·spring·servlet
666xiaoniuzi38 分钟前
深入理解 C 语言中的内存操作函数:memcpy、memmove、memset 和 memcmp
android·c语言·数据库
正在走向自律1 小时前
3.使用条件语句编写存储过程(3/10)
数据库·存储过程·安全架构
YONG823_API1 小时前
电商平台数据批量获取自动抓取的实现方法分享(API)
java·大数据·开发语言·数据库·爬虫·网络爬虫
小小不董1 小时前
图文深入理解Oracle DB Scheduler
linux·运维·服务器·数据库·oracle
大拇指的约定2 小时前
数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(三),单表查询
数据库·mysql·oracle
阳光阿盖尔2 小时前
redis——哨兵机制
数据库·redis·缓存·主从复制·哨兵
小小娥子2 小时前
【Redis】Hash类型的常用命令
数据库·spring boot·redis
盒马盒马2 小时前
Redis:cpp.redis++通用接口
数据库·c++·redis