楼主: txwdhs

SQL语句优化

[复制链接]
论坛徽章:
4
参与2007年甲骨文全球大会(中国上海)纪念
日期:2007-08-06 15:19:02ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152012新春纪念徽章
日期:2012-01-04 11:51:222013年新春福章
日期:2013-02-25 14:51:24
31#
发表于 2011-11-16 17:10 | 只看该作者
本帖最后由 philip_zhong 于 2011-11-16 17:21 编辑
txwdhs 发表于 2011-11-16 16:54
谢谢你!我大体明白了,还是有个别的地方不太清楚:

3>当前两者都不满足时,存储引擎会自动创建一个六 ...

问题1:
"你说的这种情况,如果是这样,我从哪里能看出这个存储引擎自动建在了哪里呢",你可以从源代码中check下逻辑,在table定义中是看不到的。
问题2:
你的sql中首先建立的索引是没有status这个字段的,那么意味着你需要获取status的具体值,由于mysql是PK的cluster index,所有字段的数据是挂靠在PK的叶子节点下的,因此你需要额外的访问PK获取这个status的值,从而再做filter操作,如果你的index已经包括了status字段,就无需访问PK去获取值了。

你需要深入的看下mysql的innodb的索引结构。

使用道具 举报

回复
论坛徽章:
11
鲜花蛋
日期:2011-09-03 18:52:38鲜花蛋
日期:2011-11-09 10:10:12茶鸡蛋
日期:2011-11-19 22:46:41茶鸡蛋
日期:2011-12-14 15:16:572012新春纪念徽章
日期:2012-01-04 11:57:56奥运会纪念徽章:赛艇
日期:2012-09-26 21:40:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24
32#
发表于 2011-11-16 17:56 | 只看该作者
@justlooks: 谢谢指出

@txwdhs:  主键索引的叶子节点包含了全部字段。这样的话走主键索引能得到你所需要的全部信息,因为所有的字段都在主键索引的叶子节点里面

使用道具 举报

回复
论坛徽章:
52
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:32:552012新春纪念徽章
日期:2012-02-07 09:59:35
33#
发表于 2011-11-16 18:50 | 只看该作者
LZ的SQL问题,最大的问题出现在:OWNUNO字段的过滤性太差,只有18个,而SQL种除了出现此字段之外 还有一个:REMOVESTATUS='n' 条件
唯一想办法提供性能的办法就是,再创建一个索引:ALTER TABLE TLI_HOME_71 ADD INDEX idx_oNo_RStatus(OWNUNO,REMOVESTATUS);
然后这条SQL就可以利用索引覆盖的原理解决性能的问题。

另外唯一性索引创建也不对,组合索引的顺序应该是:(`DIRECTID`,`OWNUNO`) 而不是 (`OWNUNO`,`DIRECTID`)

因为字段DIRECTID的过滤性好,有利于减少数据的查找能力,因为唯一索引字段值发生变化都可能需要检查,为此必须修改下组合索引的顺序...




TIMELINE_ITEM_HOME_71        0        PRIMARY        1        TLID        A        728085        \N        \N                BTREE      
TIMELINE_ITEM_HOME_71        0        IDX_TLI_HOME_71_UNIQUE        1        OWNUNO        A        18        \N        \N                BTREE      
TIMELINE_ITEM_HOME_71        0        IDX_TLI_HOME_71_UNIQUE        2        DIRECTID        A        728085        \N        \N                BTREE      
TIMELINE_ITEM_HOME_71        1        IDX_TLI_HOME_71_CREATEDATE        1        CREATEDATE        A        1309        \N        \N                BTREE   

使用道具 举报

回复
论坛徽章:
0
34#
 楼主| 发表于 2011-11-17 13:15 | 只看该作者
明白了,非常谢谢大家给我的指点,我再去好好看看Innodb索引方面的资料,再次感谢大家!

使用道具 举报

回复
论坛徽章:
0
35#
 楼主| 发表于 2011-11-29 18:26 | 只看该作者
又来麻烦大家了,对那个列增加了组合索引,进行压力测试,在慢日志里还是会有400秒的查询,应该从哪里再进行优化呢?执行计划里也都走了索引,100多W的数据,为什么会那么慢呢?硬盘没做RAID,7200转的,不至于吧?

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表