`
lc87624
  • 浏览: 143861 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

记公司邮件组里的一次sql优化讨论

阅读更多
Hi ALL

无线有一张表,需要对其中一个token字段按照一个规则除重

表结构如下:
+---------------+--------------+------+-----+---------+----------------+

| Field         | Type         | Null | Key | Default | Extra          |

+---------------+--------------+------+-----+---------+----------------+

| sysid         | bigint(20)   | NO   | PRI | NULL    | auto_increment |

| username      | varchar(50)  | YES  |     | NULL    |                |

| uid           | varchar(50)  | NO   |     | NULL    |                |

| vid           | varchar(50)  | NO   |     | NULL    |                |

| token         | varchar(170) | NO   | MUL | NULL    |                |

| pid           | char(5)      | NO   | MUL | 10010   |                |

| tokentype     | tinyint(2)   | NO   |     | NULL    |                |

| lastlogintime | datetime     | YES  |     | NULL    |                |

+---------------+--------------+------+-----+---------+----------------+


除重的sql语句如下:
update pushtoken inner join (select max(lastlogintime) maxtime,count(1),token from pushtoken where pid = "10010" group by token having count(1) >1 ) as t2 on pushtoken.token = t2.token set pushtoken.token = null where pushtoken.lastlogintime <> t2.maxtime ;


翻译成人类语言就是,如果token有重复,就保留lastlogintime最新的,其他的置成空

问题在于:
该表一共390w+行数据,mysql执行此语句,需要好几个小时,求优化方案。

回复一:
引用

参考方案:
生成个临时表,结构一样,把token字段设置成不能重复,
然后insert into 临时表 select * from 表 order by lastlogintime desc,
再rename 临时表。
注意备份。
Insert的时候加下ignore。


回复二:
引用


临时想的解决思路,不知道是否符合你得需求:

创建个临时表,保存不置空token的信息
CREATE TABLE `tmp_pushtoken` (
  `sysid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '唯一id',
  `token` varchar(170) NOT NULL COMMENT '实际的token或者requestid',
  PRIMARY KEY (`sysid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

从原表导出不置空token的sysid,token信息保存到临时表
insert into tmp_pushtoken SELECT sysid,token FROM pushtoken WHERE pid = "10010" GROUP BY token HAVING count(1) >1 AND MAX(lastlogintime);

原表指定条件所有token置空
update pushtoken SET token = null WHERE AND pid = "10010";

将临时表token信息恢复到原表中
update pushtoken INNER JOIN tmp_pushtoken SET pushtoken.token=tmp_pushtoken.token ON USING(sysid);



回复三:
引用

呃,我觉得这主要是查询慢吧,token字段不适合建索引么?


回复四:
引用

1,
select max(lastlogintime) maxtime,count(1),token from pushtoken where pid = "10010" group by token having count(1) >1

这个单独做个临时表,然后 maxtime上头建立个索引、token上头建立个索引。

2,把上面的表代换回原来的查询里头(原表的token字段、lastlogin字段也要索引
一个)。估计能快个十几倍,但应该也是分钟级别 的,还好是清洗数据。

3,drop掉步骤1里头的表。

4,原该弄not null约束的,就得加上了

p.s. 原著要求不能rename table,所以下头这个子查询的方案是我建议的,起码
不用编码能完活儿。不过预计到会慢了,在dml里头的子查询不是mysql的强项。
分享到:
评论

相关推荐

    Tool For SQL Server

    标题 "Tool For SQL Server" 暗示我们讨论的是一款专为Microsoft SQL Server设计的工具。这款工具可能包含了用于管理、优化、分析或备份SQL Server数据库的各种功能。SQL Server是微软公司开发的一款关系型数据库...

    SQL Anywhere Database Guid

    - **查询优化**:讨论了如何编写高效查询语句,包括索引使用技巧、查询分析工具的应用等。 - **索引策略**:分析了不同类型的索引及其适用场景,并给出最佳实践建议。 - **缓存机制**:阐述了缓存工作原理以及如何...

    SQL Server 2005精髓(SQL Server 2005 Reporting Essentials) 英文版

    《SQL Server 2005 Reporting Essentials》是针对SQL Server 2005报告服务的一本详尽指南,英文版的电子书以CHM(Compiled Help Manual)格式提供。这本书深入探讨了SQL Server 2005在报表方面的核心概念、技术和...

    提高批量SQL执行程序速度

    批量SQL执行程序的速度优化 本文将为您详细介绍如何提高批量SQL执行程序的速度,包括批量发送SQL、指定SQL条数、触发事件函数等内容。同时,我们还将讨论DataAdapter.Update(DataTable)方法的使用、SqlBulkCopy类的...

    邮件管理系统

    【邮件管理系统】是一种用于处理和管理电子邮件的应用程序,它允许用户发送、接收、存储和管理邮件。在本项目中,我们关注的是一个基于B/S架构的邮件管理系统,即Browser/Server(浏览器/服务器)模式,这意味着用户...

    访客问答系统源码sql

    【访客问答系统源码sql】是一个用于构建在线问答平台的源代码集合,其中包含了SQL相关的数据存储和管理部分。这种系统通常用于实现用户之间的互动问答功能,类似于知名的Stack Overflow或者知乎,允许访客提出问题、...

    C# 邮件系统(读邮件及发邮件 )

    在本文中,我们将深入探讨如何使用C#语言构建一个完整的邮件系统,涵盖读取和发送邮件,以及附件处理、用户管理等核心功能。C#作为.NET框架的主要编程语言,提供了丰富的类库支持网络通信和电子邮件处理,使得开发...

    重要的SQL Server第三方工具.pdf

    例如,Lumigent Technologies公司提供的LogExplorer工具,它能够读取SQL Server的交易日志,帮助管理员定位和撤销对数据产生破坏的交易操作。这对于需要恢复数据、进行故障排除和保证数据安全的DBA来说,是一个非常...

    Pro SQL Server 2008 Reporting Services 数据库

    《Pro SQL Server 2008 Reporting Services》是SQL Server 2008数据库系统中关于报表服务的一本权威指南,旨在帮助读者深入理解和掌握SQL Server 2008中的Reporting Services功能。这本书以PDF格式的英文版呈现,是...

    Microsoft SQL Server 2012 Internals

    这一章节深入讲解了数据库文件的结构(例如,数据文件和日志文件),文件组的管理,以及如何为数据库配置和优化文件系统。 7. 特殊数据库功能(Chapter 4): SQL Server 2012提供了许多高级功能,例如索引管理、...

    网上商城SQL

    下面我们将详细讨论网上商城中常见的SQL应用场景和相关知识点。 1. 数据库设计: - **ER模型**:网上商城通常会基于实体关系模型(ER模型)进行数据库设计,实体可能包括用户、商品、订单、购物车、支付方式等。 - ...

    sql认证的一些模拟题

    标题所指的知识点是“SQL认证的一些模拟题”,意味着这里将涉及到数据库管理以及SQL Server数据库系统中的认证相关的知识点。具体来看,描述中提及“往年的一些模拟题”,可以理解为这些题目是为了帮助准备SQL认证...

    j2ee+SQL网上书店

    总结来说,"j2ee+SQL网上书店"是一个集成了多种技术的复杂系统,涵盖了Web开发的各个方面,包括服务器端处理、数据库操作、用户交互、系统安全和性能优化。理解和掌握这些技术对于构建和维护类似的在线服务平台至关...

    电子邮件系统开发 电子邮件系统开发

    在本讨论中,我们将深入探讨电子邮件系统的核心组件、工作原理以及开发过程中的关键技术。 一、电子邮件系统概述 电子邮件系统是互联网上的一种基础服务,允许用户通过网络发送和接收文本、图像、附件等多种类型的...

    高清彩版 oracle sql performance tuning and optimization

    标题提到的 "高清彩版 oracle sql performance tuning and optimization" 指的是一本关于Oracle SQL性能调优和优化的专业书籍。从标题中可以了解到,书籍强调的是“基数(Cardinalities)”在Oracle SQL性能调整中的...

    SQL server 初级总结

    SQL Server 是一种流行的数据库管理系统,由微软公司开发,主要用于存储、管理和检索数据。这篇总结涵盖了SQL Server初级阶段的关键概念,包括数据库基础、SQL语言、表的管理、数据操作以及数据库安全性和完整性。 ...

    Microsoft SQL Server 2008 Implementation and Maintenance

    - **管理排序规则**:第2章第3节讨论了如何管理排序规则,即定义字符串数据比较方式的一组规则。合理设置排序规则对于确保数据按预期方式排序至关重要。 #### 监控和排错 SQL Server - **识别 SQL Server 服务问题...

Global site tag (gtag.js) - Google Analytics