免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1763 | 回复: 6
打印 上一主题 下一主题

【已解决】求助: 加索引, 改善性能 [复制链接]

论坛徽章:
2
2015年亚洲杯之巴林
日期:2015-02-03 21:13:57数据库技术版块每日发帖之星
日期:2015-08-26 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-09 13:35 |只看该作者 |倒序浏览
本帖最后由 cenalulu 于 2012-10-10 10:23 编辑

下面SQL
  1. select spc_results.*, spc_word_mst.WORD_NAME
  2.   from spc_results
  3.   LEFT JOIN spc_word_mst
  4.     ON spc_results.WORD_ID = spc_word_mst.WORD_ID
  5. WHERE spc_results.KRNT_CD = 'apr'
  6.    AND CONCAT(spc_results.SEARCH_DATE, ' ', spc_results.SEARCH_TIME) >=
  7.        '2012/10/05 00:00:00'
  8.    AND CONCAT(spc_results.SEARCH_DATE, ' ', spc_results.SEARCH_TIME) <
  9.        '2012/10/05 24:00:00'
  10. ORDER BY spc_results.SEARCH_DATE desc,
  11.           spc_results.SEARCH_TIME desc,
  12.           spc_results.BAITAI_ID   asc,
  13.           RESULTS_ID              asc LIMIT 0,
  14.           100
复制代码
spc_results表里数据几十万。
spc_word_mst数据几百条。

在不改变SQL的情况下,往哪个字段上加索引,会改善性能。
建表SQL
  1. CREATE TABLE `spc_results` (
  2. `RESULTS_ID`  bigint(20) NOT NULL AUTO_INCREMENT ,
  3. `KRNT_CD`  char(6) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
  4. `WORD_ID`  bigint(20) NOT NULL ,
  5. `BAITAI_ID`  char(3) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
  6. `SEARCH_DATE`  char(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  7. `SEARCH_TIME`  char(8) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
  8. `SPONSOR_URL`  varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  9. `SPONSOR_TITLE`  varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  10. `SPONSOR_INFORMATION`  varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  11. `EVIDENCE_ADDRESS`  bigint(20) NULL DEFAULT NULL ,
  12. `CREATED_AT`  datetime NULL DEFAULT NULL ,
  13. `CREATED_USER`  char(6) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  14. `CREATED_IP`  varchar(39) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  15. `UPDATED_AT`  datetime NULL DEFAULT NULL ,
  16. `UPDATED_USER`  char(6) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  17. `UPDATED_IP`  varchar(39) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  18. `AD_URL`  varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  19. PRIMARY KEY (`RESULTS_ID`),
  20. INDEX `KRNT_CD` USING BTREE (`KRNT_CD`) ,
  21. INDEX `dateindex` USING BTREE (`SEARCH_DATE`, `SEARCH_TIME`)
  22. )
  23. ENGINE=InnoDB
  24. DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
  25. AUTO_INCREMENT=1413495
  26. ROW_FORMAT=COMPACT
  27. ;

  28. CREATE TABLE `spc_word_mst` (
  29. `KRNT_CD`  char(6) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
  30. `WORD_ID`  bigint(20) NOT NULL ,
  31. `WORD_NAME`  varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  32. `WORD_FLG`  char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  33. `CREATED_AT`  datetime NULL DEFAULT NULL ,
  34. `CREATED_USER`  char(6) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  35. `CREATED_IP`  varchar(39) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  36. `UPDATED_AT`  datetime NULL DEFAULT NULL ,
  37. `UPDATED_USER`  char(6) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  38. `UPDATED_IP`  varchar(39) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  39. PRIMARY KEY (`KRNT_CD`, `WORD_ID`),
  40. INDEX `WORD_ID` USING BTREE (`WORD_ID`)
  41. )
  42. ENGINE=InnoDB
  43. DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
  44. ROW_FORMAT=COMPACT
  45. ;
复制代码
我在spc_results_jh表的KRNT_CD字段上加了索引,spc_word_mst表的WORD_ID上加了索引。虽然type都变成了ref,不过速度提升不明显。Status的Handler_read_next高的吓人,11万多,这个数字跟只加spc_results.KRNT_CD = 'apr'条件所查出来的数据个数一样。是不是索引根本没起作用。                                                                                                                                                                                                               
执行计划:                                                                                                               

id        table                     type      possibale_key        key                   ken_len        ref                                 rows        extra
1        spc_results            ref        KRNT_CD                KRNT_CD          18                const                             131418     Using where; Using filesort
1        spc_word_mst       ref        WORD_ID               WORD_ID         8                  spc_results.WORD_ID   1        

请高手指点。

论坛徽章:
0
2 [报告]
发表于 2012-10-09 13:48 |只看该作者
对不住,更正一下。
Status的Handler_read_key高的吓人,11万多,这个数字跟只加spc_results.KRNT_CD = 'apr'条件所查出来的数据个数一样。是不是索引根本没起作用。                                                                                                                                                                                                               
Status的Handler_read_next高的吓人,23万多.

论坛徽章:
1
2015亚冠之本尤德科
日期:2015-06-05 17:25:48
3 [报告]
发表于 2012-10-09 17:09 |只看该作者
1,看执行计划
2,自己搭建一个测试环境,把数据导过来,自己加索引做测试
3,基本上的问题,都可以通过索引解决,如果索引解决不了。我认为就要从数据表的结构入手了。

论坛徽章:
0
4 [报告]
发表于 2012-10-09 19:14 |只看该作者
本帖最后由 cchallenge 于 2012-10-09 19:14 编辑

多谢回复。执行计划看都行了。不过还是很花时间。20多万的数据,要8秒。

看来得从其他地方着手了

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
5 [报告]
发表于 2012-10-09 19:55 |只看该作者
原因很简单:    AND CONCAT(spc_results.SEARCH_DATE, ' ', spc_results.SEARCH_TIME) >=
       '2012/10/05 00:00:00'
   AND CONCAT(spc_results.SEARCH_DATE, ' ', spc_results.SEARCH_TIME) <
       '2012/10/05 24:00:00'
这个条件导致了无法使用索引。

优化方案:
把条件改成
spc_results.SEARCH_DATE >='2012-10-05' and spc_results.SEARCH_DATE <= '2012-10-05'
and spc_results.SEARCH_TIME >='00:00:00'' and spc_results.SEARCH_TIME <= '24:00:00'
索引列的外面不要加任何函数,是SQL优化的最基本原则。

此外把 date 和 time合并成一个物理列是一个比较好的方案。

论坛徽章:
2
2015年亚洲杯之巴林
日期:2015-02-03 21:13:57数据库技术版块每日发帖之星
日期:2015-08-26 06:20:00
6 [报告]
发表于 2012-10-09 21:16 |只看该作者
多谢楼上。
两个方法都不错。
我试试!

论坛徽章:
0
7 [报告]
发表于 2012-10-10 10:19 |只看该作者
改完sql不到1秒完事了。多谢cenalulu
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP