mysql对大量数据查询花费时间_对于Mysql大量数据查询速度慢的问题

当MySQL数据库中数据量过大时,查询速度会变慢,影响用户体验。通过建立索引,如对VW_ST_INDEX_INST_DAY_2310_DT_X表的REPORT_ID, LATN_ID, DATE_NO字段创建索引,可以显著提高查询效率。此外,调整字段长度也至关重要,避免因键长度超过限制导致的索引建立失败。例如,GBK字符集下,需确保各字段长度乘以2后不超过1000。对于UTF8字符集,乘以3后不应超过限制。" 106261105,7363983,深入理解Nginx超时配置,"['Nginx', '服务器配置', '网络编程', 'HTTP超时']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.如果mysql数据量过大,当查询的时候耗时比较长,则会影响页面数据展示。给客户的直观反应的:

点击了某个查询功能,结果等了差不多十几秒才反应出来,这样的体验感太差了。

2.为了增加反应速度。一般来是建立索引,如我现在的查询语句:

SELECT

aa.INDI_NAME,

aa.gg,

aa.gp,

aa.pn,

bb.report_name

FROM

(

SELECT

T.INDI_ID,

T.INDI_NAME,

SUM(CASE WHEN T.AREA_ID =2501 THEN T.INDI_VALUE ELSE 0 END) gg,

SUM(CASE WHEN T.AREA_ID =2502 THEN T.INDI_VALUE ELSE 0 END) gp,

SUM(CASE WHEN T.AREA_ID =2503 THEN T.INDI_VALUE ELSE 0 END) pn

FROM VW_ST_INDEX_INST_DAY_2310_DT_X T

WHERE T.MONTH_NO = '201708'

AND T.DATE_NO = '20170831'

AND T.LATN_ID = '1100'

AND T.TYPE_ID < '99'

AND T.REPORT_ID = '23100104' -- 该至是个变至1到4变化 例如:23100101,23100102,23100103,23100104

GROUP BY T.INDI_ID, T.INDI_NAME

UNION ALL

SELECT T.INDI_ID, T.INDI_NAME,

SUM(CASE WHEN T.AREA_ID =2501 THEN T.INDI_VALUE ELSE 0 END) gg,

SUM(CASE WHEN T.AREA_ID =2502 THEN T.INDI_VALUE ELSE 0 END) gp,

SUM(CASE WHEN T.AREA_ID =2503 THEN T.INDI_VALUE ELSE 0 END) pn

FROM VW_ST_INDEX_INST_DAY_2310_DT_X T

WHERE T.MONTH_NO = '201708'

AND T.LATN_ID = '1100'

AND T.DATE_NO <= '20170831'

AND T.TYPE_ID ='99'

AND T.REPORT_ID = '23100104' -- 该至是个变至1到4变化 例如:23100101,23100102,23100103,23100104

GROUP BY T.INDI_NAME, T.INDI_ID) aa,

(SELECT

*

from dim_report_conf

where report_id = '23100104') bb -- 该至是个变至1到4变化 例如:23100101,23100102,23100103,23100104

如下反应速度比较慢是2秒

0818b9ca8b590ca3270a3433284dd417.png

建立索引:

0818b9ca8b590ca3270a3433284dd417.png

索引语句:

CREATE INDEX vwIndexIdLAAAA on vw_st_index_inst_day_2310_dt_x (REPORT_ID,LATN_ID,DATE_NO);

然后再次或者多次查询就变成了0.009秒了

0818b9ca8b590ca3270a3433284dd417.png

所以还是建立索引比较快。

则是你数据库字段太长了,需要修改具体的长度计算规则如下:

经过查询才知道,是Mysql的字段设置的太长了,于是我把这两个字段的长度改了一下就好了。

建立索引时,数据库计算key的长度是累加所有Index用到的字段的char长度后再按下面比例乘起来不能超过限定的key长度1000:

latin1 = 1 byte = 1 character

uft8 = 3 byte = 1 character

gbk = 2 byte = 1 character

举例能看得更明白些,以GBK为例:

CREATE UNIQUE INDEX `unique_record` ON reports (`report_name`, `report_client`, `report_city`);

其中report_name varchar(200), report_client varchar(200), report_city varchar(200)

(200 + 200 +200) * 2 = 1200 > 1000,所有就会报1071错误,只要将report_city改为varchar(100)那么索引就能成功建立。

如果表是UTF8字符集,那索引还是建立不了。

(200 + 200 +200) * 3 = 1800 大于提示信息字段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值