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

一般情况下都是这样写

  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条件有两个字段,我们可以通过以下语句计算一下两列数据在表中的区分度

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

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

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

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

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

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

缺点

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

适用场景

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

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

改写后的SQL语句:

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

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

使用前提

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

优化原理

先根据过滤条件利用覆盖索引取出主键的comment_id,然后再进行排序,取出我们所需要的数据的行数,然后再和评论表通过主键进行排序来取出其他的字段,

这种方式的数据开销是索引 IO +索引分页后的结果(15行数据)的表的IO,

优点

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

应用场景:

当查询和排序字段(即where子句和order by子句所涉及的字段),有对应的覆盖索引的情况下使用

并且查询的结果集很大的情况下也是适用于这种情况的

二. 如何删除重复数据

要求

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

步骤一

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

查询语句:

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

步骤二

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

备份语句:

  1. CREATE TABLE bak_product_comment_190108 AS SELECT * FROM product_comment;

如果提示:

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

则换用下面的语句

  1. CREATE TABLE bak_product_comment_190108 AS LIKE product_comment;
  2. INSERT INTO bak_product_comment_190108 SELECT * FROM product_comment
  1. 错误代码:1786
  2. 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语句或事务都不允许执行。

解决办法

方法一

修改 :

  1. SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = off;

配置文件中 :

  1. ENFORCE_GTID_CONSISTENCY = off;

方法二:

  1. create table xxx as select 的方式会拆分成两部分。
  2. create table xxxx like data_mgr;
  3. insert into xxxx select *from data_mgr;

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

步骤三

删除同一订单的重复评论

删除语句:

  1. DELETE a FROM product_comment a
  2. JOIN(
  3. SELECT order_id,product_id,MIN(comment_id) AS comment_id
  4. FROM product_comment
  5. GROUP BY order_id,product_id
  6. HAVING COUNT(*) > 1
  7. ) b on a.order_id = b.order_id AND a.product_id = b.product_id
  8. AND a.comment_id > b.comment_id;

三. 如何进行分区间统计

要求

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

SQL语句

  1. SELECT
  2. COUNT(CASE WHEN IFNULL(total_money,0) >= 1000 THEN a.customer_id END) AS '大于1000'
  3. ,COUNT(CASE WHEN IFNULL(total_money,0) >= 800 AND IFNULL(total_money,0)<1000
  4. THEN a.customer_id END) AS '800~1000'
  5. ,COUNT(CASE WHEN IFNULL(total_money,0) >= 500 AND IFNULL(total_money,0)<800
  6. THEN a.customer_id END) AS '500~800'
  7. ,COUNT(CASE WHEN IFNULL(total_money,0) < 500 THEN a.customer_id END) '小于500'
  8. FROM mc_userdb.customer_login a
  9. LEFT JOIN
  10. (
  11. SELECT customer_id,SUM(order_money) AS total_money
  12. FROM mc_orderdb.order_master
  13. GROUP BY customer_id
  14. ) b
  15. ON a.customer_id = b.customer_id

检验一下结果是否正确



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

(5) 电商场景下的常见业务SQL处理的更多相关文章

  1. UI设计教程分享:电商网页页面设计常见表现手法

    1.手绘插画  场景.人物以及加上故事的创意绘画 会给人梦幻若隐若现的感觉,留下深刻的印象,适合做活动页面以及宣传自已的品牌 2.简约 颜色少于三色,背景以明度偏低的颜色为主,在信息大爆炸的时代,我们 ...

  2. Java进阶专题(十五) 从电商系统角度研究多线程(下)

    前言 ​ 本章节继上章节继续梳理:线程相关的基础理论和工具.多线程程序下的性能调优和电商场景下多线程的使用. 多线程J·U·C ThreadLocal 概念 ​ ThreadLocal类并不是用来解决 ...

  3. 开发者如何快速搭建自己的电商App?

    面向电商购物场景,HMS Core提供了创新的电商解决方案,帮助应用快速获客.提升转化率,实现业务增长.为了帮助开发者了解如何在电商购物类应用中集成HMS Core的各项能力,HMS Core开发了电 ...

  4. Java进阶专题(十三) 从电商系统角度研究多线程(上)

    前言 ​ 本章节主要分享下,多线程并发在电商系统下的应用.主要从以下几个方面深入:线程相关的基础理论和工具.多线程程序下的性能调优和电商场景下多线程的使用. 多线程J·U·C 线程池 概念 回顾线程创 ...

  5. 把握这两点,抢占下一个电商风口|2016最新中国电商App排名&研究报告

    序言 电商,是随着中国互联网经济的持续发展所成长起来的.淘宝.京东这些电商从交易额和影响力上看都位列中国最为成功.最具话题性的互联网企业之中.尽管近几年中国经济有所放缓,但中国消费市场的增长速度仍有望 ...

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

    课程大纲及内容简介: 每节课约35分钟,共不下40讲 第一章(11讲) ·分布式和传统单机模式 ·Hadoop背景和工作原理 ·Mapreduce工作原理剖析 ·第二代MR--YARN原理剖析 ·Cl ...

  7. Java生鲜电商平台-优惠券系统的架构设计与源码解析

    Java生鲜电商平台-优惠券系统的架构设计与源码解析 电商后台:实例解读促销系统 电商后台系统包括商品管理系统.采购系统.仓储系统.订单系统.促销系统.维权系统.财务系统.会员系统.权限系统等,各系统 ...

  8. zz京东电商推荐系统实践

    挺实在 今天为大家分享下京东电商推荐系统实践方面的经验,主要包括: 简介 排序模块 实时更新 召回和首轮排序 实验平台 简介 说到推荐系统,最经典的就是协同过滤,上图是一个协同过滤的例子.协同过滤主要 ...

  9. 架构设计 | 基于电商交易流程,图解TCC事务分段提交

    本文源码:GitHub·点这里 || GitEE·点这里 一.场景案例简介 1.场景描述 分布式事务在业务系统中是十分常见的,最经典的场景就是电商架构中的交易业务,如图: 客户端通过请求订单服务,执行 ...

随机推荐

  1. ubuntu server 18.04的安装 以及配置网络还有ssh服务

    ubuntu server 18.04的安装 以及配置网络还有ssh服务   服务器是 dell T420 安装过程中规中矩,其中最关键的是分区部分,由于是服务器,如果磁盘比较大的话,一定要用 uef ...

  2. Loogn.OrmLite文档

    Getting Started 一. 引入Loogn.OrmLite PM> Install-Package Loogn.OrmLite 二.引入名称空间 using Loogn.OrmLite ...

  3. [HAOI2016]食物链

    OJ题号:BZOJ4562.洛谷3183 思路:记忆化搜索. 本体可以转化成“求有向图中入度为0的结点到出度为0的结点的路径数”. 每次加边时记录每个结点的入度和出度,然后从入度为0的结点开始搜索,搜 ...

  4. 使用 SHOW STATUS 查看mysql 服务器状态信息

    在LAMP架构的网站开发过程中,有些时候我们需要了解MySQL的服务器状态信息,譬如当前MySQL启动后的运行时间,当前MySQL的客户端会话连接数,当前MySQL服务器执行的慢查询数,当前MySQL ...

  5. php传入对象时获得类型提示

    类的类型提示 - 将类名放在需要约束的方法参数之前 语法格式: public function write(ShopProduct $shopProduct){} 数组提示: public funct ...

  6. AJAX异步传输——以php文件传输为例

     此文档解决以下问题: 一.在当前html页面显示请求的数据1.get方式请求 ,不传递参数2.get方式请求 ,传递参数3.post方式请求 ,不传递参数4.post方式请求 ,传递参数 二.通过按 ...

  7. mongodb.mongoose维护内嵌数组元素

    运行环境: - Nodejs - MongoDB 文档实例名: ProjectJob 文档格式如下: { "_id" : ObjectId("5bc69eb0b298b3 ...

  8. Java之String、StringBuilder、StringBuffer的区别

    String : 字符串常量,它们的值在创建之后不能更改.代表字符串,Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. String的值是不可变的,这就 ...

  9. 我使用过的Linux命令之date - 显示、修改系统日期时间(转)

    用途说明 ate命令可以用来显示和修改系统日期时间,注意不是time命令. 常用参数 格式:date 显示当前日期时间. 格式:date mmddHHMM 格式:date mmddHHMMYYYY 格 ...

  10. Android定位&地图&导航——基于百度地图,实现自定义图标绘制并点击时弹出泡泡

    一.问题描述 上一次我们使用百度地图实现基本的定位功能,接下来我们继续实现搜索和定位,并使用LocationOverlay绘制定位位置,同时展示如何使用自定义图标绘制并点击时弹出泡泡 如图所示: 二. ...