mysql按时间排序(java按时间排序)

牵着乌龟去散步 生活 11 0

老铁们,大家好,相信还有很多朋友对于mysql按时间排序和java按时间排序的相关问题不太懂,没关系,今天就由我来为大家分享分享mysql按时间排序以及java按时间排序的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

本文目录

  1. mysql中对表按门店编号分组,按时间降序排序后取第二条数据
  2. Mysql根据分组的时间间隔小于30分钟并分组
  3. Sql优化-多like模糊查询及根据时间排序
  4. mysql按主键排序为什么比索引快
  5. MySQL根据时间将商品销售按天为列显示
  6. mysql查询表的列名,顺序不对

一、mysql中对表按门店编号分组,按时间降序排序后取第二条数据

据我所知,MySQL没有分组里面做这么多事的函数,Oracle才有。这种定制功能适合编程实现,如果你的数据量不大,可以用Python的pandas来做。如果非用SQL,分组时候取更大日期t1,t表删除每个组更大日期t1表内容以后,再来一次剩下内容更大日期得t2,拿t2关联t可以得到你要的数据。

二、Mysql根据分组的时间间隔小于30分钟并分组

1、可以写出从数据上可以直观看出分组的sql,另外对于"分组的时间间隔小于30分钟"这句话可能引申出两种理解:

2、数据先按时间排序,只要相邻数据DEAL_TIME在30分钟以内则归组,比如2019-06-06 13:00:00, 2019-06-06 13:05:00和2019-06-06 13:32:00可以归为一组;

3、数据先按时间排序,对于理解1的3条数据,此时2019-06-06 13:32:00和2019-06-06 13:00:00的间隔超过30分钟,需要另起一组

4、对于上述两个理解我这边都给出例子,原理和MySql的rownumber实现有些类似,排序后加上条件滚动计算,方案有不足的地方, 1是多一层排序嵌套子查询, 2是结果如果不再嵌套会多出计算过程列

5、DROPTEMPORARYTABLEIFEXISTSTMP_DEAL_TIME;

6、CREATETEMPORARYTABLETMP_DEAL_TIME(DEAL_TIMEDATETIME)AS

7、SELECTDATE_ADD(CURDATE(),INTERVAL600*RAND()MINUTE)ASDEAL_TIME

8、FROM(SELECT1UNIONALLSELECT2UNIONSELECT3UNIONALLSELECT4UNIONALLSELECT5)A,

9、(SELECT1UNIONALLSELECT2UNIONSELECT3UNIONALLSELECT4UNIONALLSELECT5)B;

10、SELECTDEAL_TIMEFROMTMP_DEAL_TIMEORDERBYDEAL_TIME;

11、--理解1:只要相邻时间为指定分钟数以内则聚合

12、CASEWHEN@lastDealTimeISNULLTHEN@minLevel:=1

13、WHENDEAL_TIME>DATE_ADD(@lastDealTime,INTERVAL30MINUTE)

14、THEN@minLevel:=@minLevel+1ENDASCOMPUT_CONDITION,

15、@lastDealTime:=DEAL_TIMEASLAST_DEAL_TIME,

16、FROM(SELECTDEAL_TIMEFROMTMP_DEAL_TIMEORDERBYDEAL_TIME)E,

17、--理解2:只和开始聚合的之一条时间比较,只有当该条数据处在聚合之一条指定分钟数以内才归组

18、CASEWHEN@lastDealTimeISNULLTHEN@minLevel:=1

19、WHENDEAL_TIME>DATE_ADD(@lastDealTime,INTERVAL30MINUTE)

20、THEN@minLevel:=@minLevel+1ENDASCOMPUT_CONDITION,

21、CASEWHEN@lastDealTimeISNULLTHEN@lastDealTime:=DEAL_TIME

22、WHENDEAL_TIME>DATE_ADD(@lastDealTime,INTERVAL30MINUTE)

23、THEN@lastDealTime:=DEAL_TIMEENDASLAST_DEAL_TIME,

24、FROM(SELECTDEAL_TIMEFROMTMP_DEAL_TIMEORDERBYDEAL_TIME)E,

25、(SELECT@minLevel:=0)G;

对于理解1的执行结果如下:

26、后续可以根据结果中的GROUP_LEVEL进行分组显示

三、Sql优化-多like模糊查询及根据时间排序

1、环境:用的mysql版本 select Version();

2、用的是两张表联查,四个条件like查询,根据时间排序降序

3、其中A,B表没有大字段,A表20万多数据,B表50万多条数据。语句如下:

4、 SELECT A.bondId,A.sname,A.cname,A.secuCode,A. ISSUER,A.guarantor,B.underwriter AS infoSource

5、  LEFT JOIN B ON B.bondId= A.bondId

6、 AND B.underwriter='有限公司'

7、 AND A.startDate<='2020-04-21 18:02:10'

8、 AND A.endDate>='2020-04-21 18:02:10'

9、 A.cname LIKE'%%'  OR A.sname LIKE'%%'  OR A.secuCode LIKE'%%'

10、 OR A. ISSUER LIKE'%%'OR A.guarantor LIKE'%%')

11、 ORDER BY A.startDate DESC

12、这是2个表都没有加索引的情况,从explain来看结果非常糟糕,都是全表扫描,并且产生临时表同时有文件排序,效率肯定非常低。

13、首先尝试在B表上建立一个联合索引

14、可以考虑从关联字段及where条件字段考虑(bondId, underwriter, agentType)

15、ALTER TABLE B ADD INDEX bua_index(bondId, underwriter, agentType)

16、可以看到B表用到了我们刚刚建的联合索引,并且额外信息是Using index,type是ref级别的,效果比较理想,再来看A表。

17、 Where条件中有多个like,这种情况下一般索引都是不可用的,所以必须用覆盖索引解决,

18、由于又根据startDate排序,所以尝试根据如下字段建立联合索引,同时查询的字段就是索引中的字段(startDate, endDate,cname, sname, secuCode, issuer, guarantor)

19、ALTER TABLE A ADD INDEX index_scssig(startDate, endDate,cname, sname, secuCode, issuer, guarantor)

20、这样乍看上去A表也用到了刚刚建的联合索引,并且type是range级别虽然比ref差点,按理说应该也还可以,但是我执行sql语句,效率还是非常差,查询耗时达到8s,并且偶尔还不止这个时间

21、究其原因,虽然使用了索引,但是extra里面是Using index condition&Using where

22、回表操作了,我在想如果将extra优化成Using index效率肯定没问题

23、故再进一步优化,还是从索引入手

24、在联合索引上添加2个字段isValid, bondId再试试

25、 ALTER TABLE A ADD INDEX index_scssig(isvalid,startDate, endDate,cname, sname, secuCode, issuer, guarantor,bondId)

26、这个结果就是我想要的,然后执行sql看看效率:

27、已经提升了很多了,但是我试了别的查询条件偶尔时间会到3,4s,怀疑和自己的机器有关

28、在这这种多个like的or查询mysql本身并不擅长,无奈坑爹的需要需要这样,可能效率并不是非常的高,优化成这样可以接受了。

29、最近对以前项目的慢查询进行sql调优,感觉性能的下降往往还是sql语句及索引的建立的问题,explain是很有帮助,正确优化还是能极大提升效率的。

四、mysql按主键排序为什么比索引快

MYSQL官方文档介绍索引是一种方便快速查询数据的数据结构。用我们生活中的例子来讲,索引就好比书的目录,如果没有目录,每次你想要查找某些内容,你必须从头开始查找,这样的效率极其低下。

索引一般比较大,所以大部分情况下索引是存在磁盘的索引文件上,也有可能是存在数据文件上。

索引的种类有很多:主键索引(这是最常见的一种索引,主键不能为空且必须唯一)、唯一索引(相对于主键索引,它的值可以为空)、全文索引(在char、varchar、text类型可以使用)、普通索引、前缀索引。按照列数来区分:单一索引、组合索引(多字段组成)

在讲解MYSQL索引的数据结构之前,我们先看看了解一下其他的数据结构,看看他们的优缺点进行对比。

mysql按时间排序(java按时间排序)-第1张图片-

二叉树简单来说就是左节点大于右节点,在理想的情况下,他的查找速度就接近与二分法的性能O(log2n)。因为在内存排序的时间是非常快的,可以忽略不计,所以总的消耗时间就取决于IO的操作次数。二叉树查找速度取决树高,每次查询接口都是一次IO操作,也是性能的瓶颈所在。

但是也会有这种一种情况,同样也是二叉树,但是他的树非常高,导致查询一次需要多次IO操作,效率及其低下

平衡二叉树可以解决二叉树不稳定导致查询效率低下的缺点。平衡二叉树的特点:树的左右节点层级更高相差一层。在插入或者删除的情况下,通过左旋转或右旋转使得整个二叉树平衡,不会出现层级相差很多的情况。平衡二叉树的性能接近二分法查找O(log2n)。

平衡二叉树查找id为8的记录,只需要IO操作2次即可。但是仔细想一下,如果数据量很多呢?假设数据表有100W的数据,根据O(log2n)计算,大约需要20次IO操作。磁盘寻道大概需要10ms,总的查询时间为20* 10= 0.2,效率也比较低下。

还有就是平衡二叉树不支持范围查询,范围查询每次都需要从根节点遍历,效率及其低下。

之前的几种树形结构适合与小数据量的内存查找,也叫做内查找。在1970年,R.Bayer和E.Mccreight提出了一种适合于外查找的平衡多叉树B-树。MYSQL数据文件是存在磁盘的,每次都是按照一页大小(一般而16K)读取内存。像二叉树、平衡二叉树,每次读取节点都要进行一次IO操作,所以树越高IO操作次数越多。想要提高

五、MySQL根据时间将商品销售按天为列显示

要根据时间将商品销售按天为列显示,你可以使用MySQL的PIVOT功能来实现。以下是一个示例查询,假设你的表名为sales,之一列为date,后续列为不同商品的访问量。

这个查询使用了嵌套的子查询和CASE语句来实现PIVOT功能。首先,子查询使用ROW_NUMBER()函数为每个商品的访问量生成一个唯一的列名(例如,visits、visits2、visits3)。然后,外部查询使用MAX(CASE...)语句将每个商品的访问量放置在正确的列中,并按日期进行分组。

请注意,你需要将查询中的表名、商品名称和列名(例如,'某商品1'、'某商品2')替换为你实际使用的名称

六、mysql查询表的列名,顺序不对

1、information_schema.columns表中有一个ordinal_position字段,表示的是列标识号,其实就是字段编号,你可以看看这些字段标号是不是按照你现在有字段顺序摆列的,如果是,那么用ordinal_position排序就可以了。

2、如果不是,而是按照你查询information_schema.columns表的顺序编的号,那么可能在建表后有过插入字段(比原来表中没有第四题字段一类的),或者修改字段名称(这个也可能修改字段编号),那么就将数据备份重建该表,这样应该就没有问题了,不过可能也需要按照ordinal_position排序。

关于mysql按时间排序和java按时间排序的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签: 排序 时间 mysql java

抱歉,评论功能暂时关闭!