有没有方案大幅度提升 mysql 的查询性能?

时间:2023-02-10 16:01:51
做一个对设备数据采集的系统,设备会有点多,以万计
平均每五分钟采集一次数据,存储到 mysql 中,数据基本上是电流、电压、温度、功率……

然后将会有很多客户端浏览这些数据,随机查询某几个设备在某一天中的数据,查询语句基本上是
select DeviceId, DeviceDateTime, 电压值, 电流值, 温度值 …… from tbDeviceData Where DeviceId In (1422, 5532, 6521, 5176, 9394) And DeviceDateTime Between Date1 and Date2
其中 Date1 和 Date2 相差一天

目前表中仅有5000W条记录,但是查询效率不太理想,在启用10个线程的情况下随机查询 DeviceId 和DeviceDateTime,平均需要5.7秒,最长时间需要40秒

这个表已经是分区表,按 DeviceDateTime 进行 range 分区,但目前的5000W条数据全部都放在一个分区里。不知道分区变小一点会不会有效果。

另外,有什么办法做集群,因为我已经启用了事务日志,用另一台 mysql 作从机,但目前从机的功能只是用来做热备份而已。能不能多整几台服务器,分担主机的查询压力。

8 个解决方案

#1


没有吗?
自己顶一下!

#2


看样子数据是按时间排序的,可以从这里下文章,我是菜鸟,表示关注下

#3


先尝试一下索引,对频繁使用的SELECT语句做一下索引。 另外就是如楼主所说,多几个主从,分担查询压力。

#4


引用 3 楼 ACMAIN_CHM 的回复:
先尝试一下索引,对频繁使用的SELECT语句做一下索引。 另外就是如楼主所说,多几个主从,分担查询压力。


索引肯定是做了的,分别在 DeviceId 和 DeviceDateTime 上建了索引
多个主从的办法,能不能做到对应用程序透明?还是说应用程序在进行查询时,要随机选择一个从机?

#5


创建 (DeviceId , DeviceDateTime)索引。

MYSQL PROXY

#6


能多几台机器的话,通常考虑一下切片了,根据设备 ID 把数据分布到不同的服务器上,这样通过设备 ID,在查询之前就已经把查询分散到不同的机器上了

#7


引用 5 楼 ACMAIN_CHM 的回复:
创建 (DeviceId , DeviceDateTime)索引。

MYSQL PROXY


在我的需求里,创建复合索引比单列索引要快吗?

#8


引用 7 楼 hemowolf 的回复:
Quote: 引用 5 楼 ACMAIN_CHM 的回复:

创建 (DeviceId , DeviceDateTime)索引。

MYSQL PROXY


在我的需求里,创建复合索引比单列索引要快吗?
对。

#1


没有吗?
自己顶一下!

#2


看样子数据是按时间排序的,可以从这里下文章,我是菜鸟,表示关注下

#3


先尝试一下索引,对频繁使用的SELECT语句做一下索引。 另外就是如楼主所说,多几个主从,分担查询压力。

#4


引用 3 楼 ACMAIN_CHM 的回复:
先尝试一下索引,对频繁使用的SELECT语句做一下索引。 另外就是如楼主所说,多几个主从,分担查询压力。


索引肯定是做了的,分别在 DeviceId 和 DeviceDateTime 上建了索引
多个主从的办法,能不能做到对应用程序透明?还是说应用程序在进行查询时,要随机选择一个从机?

#5


创建 (DeviceId , DeviceDateTime)索引。

MYSQL PROXY

#6


能多几台机器的话,通常考虑一下切片了,根据设备 ID 把数据分布到不同的服务器上,这样通过设备 ID,在查询之前就已经把查询分散到不同的机器上了

#7


引用 5 楼 ACMAIN_CHM 的回复:
创建 (DeviceId , DeviceDateTime)索引。

MYSQL PROXY


在我的需求里,创建复合索引比单列索引要快吗?

#8


引用 7 楼 hemowolf 的回复:
Quote: 引用 5 楼 ACMAIN_CHM 的回复:

创建 (DeviceId , DeviceDateTime)索引。

MYSQL PROXY


在我的需求里,创建复合索引比单列索引要快吗?
对。