对于Mysql大量数据查询速度慢的问题

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秒

 

建立索引:

索引语句:

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

 

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

 

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

Specified key was too long; max key length is 767

如果出现这种错误:Specified key was too long; max key length is 767

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

经过查询才知道,是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 大于提示信息字段。

 

转载于:https://my.oschina.net/u/1399599/blog/1536886

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL查询大量数据时,有几个方面需要考虑。首先,内存占用是一个重要的问题。可以通过查询MySQL返回大量结果的原理、手册和源码分析来了解如何优化内存占用问题。其次,可以通过开启慢查询日志来找出较慢的SQL语句。另外,还有一些查询的优化技巧,比如尽可能将操作移至等号右边、简化SQL语句、拆分大语句、减少锁时间、避免使用函数和触发器、少用JOIN、使用同类型进行比较、避免使用!=或<>操作符、使用BETWEEN而不是IN、使用LIMIT来分页等。对于使用Mybatis的情况,可以通过设置fetchSize为-2147483648来实现流式查询。综上所述,查询MySQL大量数据时,可以结合以上的优化策略来提高查询性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PHP查询MySQL大量数据的时候内存占用分析](https://download.csdn.net/download/weixin_38632763/13065449)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [MySQL 大表优化方案](https://blog.csdn.net/cc_1209/article/details/102665446)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [MySQL大数据查询方案](https://blog.csdn.net/qq_19922839/article/details/126411574)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值