电商场景下的常见业务SQL处理

1. 如何对评论进行分页展示

一般情况下都是这样写

 SELECT customer_id,title,content FROM product_comment WHERE audit_status = 1 AND product_id =199726 LIMIT 0,15;;

我们来看看它的执行计划

可以看到possible_keys、key、key_len的值均为NULL,说明这条SQL在product_comment 表上是没有可用的索引的,取出9593行过滤度为1%

1. 建立索引,优化评论分页查询

根据我们索引规范可以考虑在where条件上建立索引
where条件有两个字段,我们可以通过以下语句计算一下两列数据在表中的区分度

计算字段数据区分度,建立索引

SELECT COUNT(DISTINCT audit_status)/COUNT(*) AS audit_rate,COUNT(DISTINCT product_id)/COUNT(*) AS product_rate FROM product_comment;

比值越接近1,代表区分度越好,我们应该把区分度好的列放到联合索引的左侧

我们现在建立索引后,再来看看执行计划

可以看到查询时运用到了联合索引,只查询出一条数据,就能返回我们需要的数据了,过滤程度是百分之百,我们完成了第一步优化

数据库的访问开销 = 索引 IO + 索引全部记录结果所对应的一个表数据的 IO

缺点

这种SQL语句查询的缺点是,越往后翻页,比如几千页之后,效率会越来越差,查询时间也会越来越长,尤其表数据量大的时候更是如此

适用场景

它的适用场景是表的结果集很小,比如一万行以下时,或查询条件非常复杂,比如涉及到多个不同的查询判断,或是表关联时使用

2. 进一步优化评论分页查询,SQL语句改写

改写后的SQL语句:

SELECT t.customer_id,t.title,t.content
FROM (
SELECT customer_id  FROM product_comment WHERE  product_id =199726 AND audit_status = 1 LIMIT 0,15
)a JOIN product_comment t
ON a.customer_id = t.comment_id;

改写前的SQL和改写后的SQL查询出来的结果集是一样的,但是效率要高于改写前的SQL

使用前提

使用这个SQL有一个前提是,商品评论表的主键是customer_id ,且是有覆盖索引(也就是刚刚我们建立的联合索引)

优化原理

先根据过滤条件利用覆盖索引取出主键的comment_id,然后再进行排序,取出我们所需要的数据的行数,然后再和评论表通过主键进行排序来取出其他的字段,
这种方式的数据开销是索引 IO +索引分页后的结果(15行数据)的表的IO,

优点

比改写前的SQL在IO上要节省很多,这种改写方式的优点是在每次翻页的所消耗的资源和时间基本是相同的,不会越往后翻页,效率越差

应用场景:

当查询和排序字段(即where子句和order by子句所涉及的字段),有对应的覆盖索引的情况下使用
并且查询的结果集很大的情况下也是适用于这种情况的

二. 如何删除重复数据

要求

删除评论表中对同一订单同一商品的重复评论,只保留最早的一条

步骤一

查看是否存在对于同一订单同一商品的重复评论,如果存在,进行后续步骤

查询语句:

SELECT order_id,product_id,COUNT(*) FROM product_comment
GROUP BY order_id,product_id HAVING COUNT(*) > 1;

步骤二

备份product_comment表(避免误删除的情况)

备份语句:

 CREATE  TABLE bak_product_comment_190108 AS  SELECT * FROM product_comment;

如果提示:

错误代码:1786 Statement violates GTID consistency:CREATE TABLE ... SELECT.

则换用下面的语句

    CREATE  TABLE bak_product_comment_190108 AS  LIKE  product_comment;
    INSERT INTO bak_product_comment_190108  SELECT * FROM product_comment;
错误代码:1786
Statement violates GTID consistency:CREATE TABLE ... SELECT.

错误原因

这是因为在5.6及以上的版本内,开启了 enforce_gtid_consistency=true 功能导致的,MySQL官方解释说当启用 enforce_gtid_consistency 功能的时候,MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行,像create table … select 和 create temporarytable语句,以及同时更新事务表和非事务表的SQL语句或事务都不允许执行。

解决办法

方法一

修改 :

SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = off;

配置文件中 :

ENFORCE_GTID_CONSISTENCY = off;

方法二:

create table xxx as select 的方式会拆分成两部分。

create table xxxx like data_mgr;
insert into xxxx select *from data_mgr;

如果表数据量比较大,则使用mysql dump的方式导出成文件进行备份

步骤三

删除同一订单的重复评论

删除语句:

DELETE a FROM product_comment a
JOIN(
SELECT order_id,product_id,MIN(comment_id) AS comment_id
FROM product_comment
GROUP BY order_id,product_id
HAVING COUNT(*) > 1
) b on a.order_id = b.order_id AND a.product_id = b.product_id
AND a.comment_id > b.comment_id;

三. 如何进行分区间统计

要求

统计消费总金额大于1000元的,800到1000元的,500到800元的,以及500元以下的人数

SQL语句

SELECT
COUNT(CASE WHEN IFNULL(total_money,0) >= 1000 THEN a.customer_id END) AS '大于1000'
,COUNT(CASE WHEN IFNULL(total_money,0) >= 800 AND IFNULL(total_money,0)<1000
    THEN a.customer_id END) AS '800~1000'
,COUNT(CASE WHEN IFNULL(total_money,0) >= 500 AND IFNULL(total_money,0)<800
    THEN a.customer_id END) AS '500~800'
,COUNT(CASE WHEN IFNULL(total_money,0) < 500 THEN a.customer_id END)  '小于500'
FROM mc_userdb.customer_login a
LEFT JOIN
(
SELECT customer_id,SUM(order_money) AS total_money
    FROM mc_orderdb.order_master
    GROUP BY customer_id
    ) b
ON a.customer_id = b.customer_id

检验一下结果是否正确


总和是10010,说明查询结果正确

原文地址:https://www.cnblogs.com/huchong/p/10237854.html

时间: 2024-10-09 00:39:48

电商场景下的常见业务SQL处理的相关文章

【问答集锦】人工智能/机器学习技术在电商场景下的应用

近年来阿里不断运用深度学习.强化学习等人工智能领域的相关知识优化自身电商平台的搜索引擎和推荐系统,让其从冷冰冰的系统不断成长为越来越懂用户的智能购物助手. 日前,<尽在双11>人工智能部分执笔人&阿里技术专家 乐田 与 仁重 就 "人工智能/机器学习技术在电商场景下的应用" 问题在OSCHINA与大家开展了问答活动. 本文整理了两位老师在开源中国高手问答中的精彩问答. 1 . 机器学习在电商方面除了广告推荐之类的方面外,还有其他的应用么?谢谢,还有学习这方面需要哪些

汽车电商?下一波新趋势?

说起国内的汽车电商,这个概念已经流行了好几年,可是看看国内的汽车电商现状,到目前为止却还没有任何一家平台真正实现了电商化.真正的电商化要完成资金流.信息流和物流的整个完整环节,目前几乎所有的网站都是以信息流为主,汽车交易并没有在线上完成,最终都是通过线下交易完成. 那么,究竟是什么原因导致了汽车电商无法真正落到实处?刘旷认为主要存在以下几个问题: 第一个问题就是物流问题.对于一辆汽车来说,不同于一般的网上交易商品,自身的体积和重量导致快递送货成为了一个巨大的问题. 第二个问题就是购车的后续问题,

微博电商VS微信电商 同质化下的差异竞争

近日,新浪微博主导的微电商峰会透露,微博将联合阿里.微卖等第三方合作伙伴,共建以兴趣为导向的移动社交电商平台,试图抄底微信电商.微博电商VS微信电商,你更看好哪一个? 文/张书乐 刊载于<销售与市场>杂志管理版2015年09期 7月7日,由新浪微博主导的微电商峰会召开,此次会议透露,微博将联合阿里.微卖等第三方重点合作伙伴,共建以兴趣为导向的移动社交电商平台. 为了给此次全新亮相站台,微博CEO王高飞甚至在会议上喊出了"请忘记自己是社交产品"的雷人之语,并标榜称:"

农村电商政策下的扎西红生态农业庄园

二零一五年政府工作报告中李克强总理提出了我们中国的发展进入"互联网+"时代后,互联网在各行各业的运用已经全方位覆盖,切身影响着我们的生活,与我们的生活习惯嘻嘻线管,也许你没有发现,也许也是在潜移默化地被同化了.小到我们生活的每一个细节,比如我们的支付习惯已经从之前的现金支付到刷pos机到现在的微信或者支付宝支付,出门去吃个早点,买点水果,都会先问可以微信支付宝支付不,要是不能,我们都还一家店铺.诸如此类甚多,在互联网时代,我们身边的网络信息化太普及了,点个外面,刷个微博,聊聊微信,逛逛

跨境电商成为下一个风口

近年来,跨境电商的大火使越来越多的人想要开始了解跨境电商是什么,以及为什么跨境电商如此受欢迎.要相信互联网时代是一个能够创造奇迹的时代,电商行业一直在不断寻找新的市场,亚马逊的红利期即将到来,抓住机遇,这个全球电商巨头的布局马上迎来爆发!国内电子商务发展十多年来,我国电子商务市场已基本饱和.旧模式已经很难再挤进去.新蓝海跨境电商的发展前景相对较好,然后出现了亚马逊的无货源模式.亚马逊是一个国际购物平台,简单理解亚马逊的无货源模式就是把国内平台产品上涨价格转移到亚马逊平台销售.由于我们是发展中国家

电商巨头线下实体店成功率分析

日前,有消息传出阿里巴巴将在天津开办第一家实体店,销售的商品非常多样,食品.厨具等都能找到,希望借庞大的实体市场推动进口商品销量,同时为顾客提供更加人性化的购物体验.这是继阿里收购银泰,落地门店服务的又一次动作. 而纯线上平台到线下插一脚的事并不鲜见.2015年,聚美优品在前门大街开设极速免税体验店;亚马逊开设实体体验店;京东先携手便利店,然后入股永辉,强推"京东到家";当当开设实体书店;苏宁旗下的母婴电商红孩子纷纷尝试选址落地-- 尽管电商巨头无一例外开始线下布局,但至今为止,似乎并

电商峰值系统架构设计--转载

1.1 系统架构设计目录 摘要:双11来临之际,<程序员>以“电商峰值系统架构设计”为主题,力邀京东.当当.小米.1号店.海尔商城.唯品会.蘑菇街.麦包包等电商企业,及商派.基调网络等服务公司,分享电商峰值系统架构设计的最佳技术实践. 自2009年11月11日,淘宝商城(现名天猫)拉开网购狂欢节的序幕,各大电商的促销浪潮此起彼伏.此时的电商大战不仅是价格之争,更是技术的较量.如何设计电商峰值系统来更好地满足用户蜂拥而至的访问,如何在海量数据处理中实时发现有效信息并转化为商机,成为众多电商企业密

Cloudera Hadoop 4 实战课程(Hadoop 2.0、集群界面化管理、电商在线查询+日志离线分析)

课程大纲及内容简介: 每节课约35分钟,共不下40讲 第一章(11讲) ·分布式和传统单机模式 ·Hadoop背景和工作原理 ·Mapreduce工作原理剖析 ·第二代MR--YARN原理剖析 ·Cloudera Manager 4.1.2安装 ·Cloudera Hadoop 4.1.2 安装 ·CM下集群管理一 ·CM下集群管理二 ·Hadoop fs 命令详解 ·cloudera manager管理集群·cloudera manager下集群高级管理 第二章(约10讲) ·Hive数据表和

亿级流量电商详情页系统的大型高并发与高可用缓存架构实战

对于高并发的场景来说,比如电商类,o2o,门户,等等互联网类的项目,缓存技术是Java项目中最常见的一种应用技术.然而,行业里很多朋友对缓存技术的了解与掌握,仅仅停留在掌握redis/memcached等缓存技术的基础使用,最多了解一些集群相关的知识,大部分人都可以对缓存技术掌握到这个程度.然而,仅仅对缓存相关的技术掌握到这种程度,无论是对于开发复杂的高并发系统,或者是在往Java高级工程师.Java资深工程师.Java架构师这些高阶的职位发展的过程中,都是完全不够用的.技术成长出现瓶颈,在自己