楼主: 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
21#
发表于 2011-11-10 16:28 | 只看该作者
"不知道66W级别的数据,1.9秒的速度算正常吗?是不是还是有些慢呢?",目前SQL语句的优化只能到这一步了,剩下的你可以做设计和系统级别的优化。
1.系统级别的优化是增强机器的内存、CPU和磁盘速度,然后将innodb的buffer_pool加大,使得每次数据的扫描都是在内存完成。
2.设计上的优化是,需要根据你的业务将数据变的不集中或者变小。

使用道具 举报

回复
论坛徽章:
0
22#
 楼主| 发表于 2011-11-10 16:32 | 只看该作者
philip_zhong 发表于 2011-11-10 16:28
"不知道66W级别的数据,1.9秒的速度算正常吗?是不是还是有些慢呢?",目前SQL语句的优化只能到这一步了,剩 ...

好的,我再去看看其他的地方,非常感谢!

使用道具 举报

回复
论坛徽章:
3
ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262012新春纪念徽章
日期:2012-01-04 11:53:29蜘蛛蛋
日期:2012-03-09 15:07:54
23#
发表于 2011-11-10 18:57 | 只看该作者
justlooks 发表于 2011-11-10 16:21
你这个查询只是用到了原来索引的一部分,那么另外的数据需要从cluster index中找,而因为OWNUNO列的聚集度比 ...

不太理解
secondary index都是要走主键的啊
难道说count 可以在直接在 secondary index里面取到?

使用道具 举报

回复
论坛徽章:
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
24#
发表于 2011-11-10 19:33 | 只看该作者
txwdhs 发表于 2011-11-10 16:26
可是那个REMOVESTATUS里只有Y和N,聚集度比较高,加这样一个索引按理说不会太有效吧?

但是philip_zhong说的是 建一个新的索引OWNUNO+REMOVESTATUS, 而不是单独对REMOVESTATUS加索引。

而你假如之前没有对REMOVESTATUS加索引,那么虽然这个字段的取值只有Y /N 但是,由于secondary index的叶子节点不保存这个字段的相关信息。还得去额外去扫描primary 索引去判断是否符合条件。这里的代价肯定比较大的。
当你加了索引之后,那么在叶子节点直接可以找到这个REMOVESTATUS的信息,所以直接可以判断,不需要额外的I/O。效率自然就提升了

使用道具 举报

回复
论坛徽章:
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
25#
发表于 2011-11-10 19:37 | 只看该作者
jiwang1980 发表于 2011-11-10 18:57
不太理解
secondary index都是要走主键的啊
难道说count 可以在直接在 secondary index里面取到?

不是绝对要走主键索引的。这要看你最终需要的字段信息是不是在secondary index字段里面,如果已经在secondary index里面了,就不需要了。平常说的索引扫描就是这个原理吧,仅仅需要扫描索引文件,而不需要扫描数据文件。

使用道具 举报

回复
论坛徽章:
0
26#
 楼主| 发表于 2011-11-15 16:40 | 只看该作者
icer_repls 发表于 2011-11-10 19:33
但是philip_zhong说的是 建一个新的索引OWNUNO+REMOVESTATUS, 而不是单独对REMOVESTATUS加索引。

而 ...

看了你之前发的关于索引的帖子,有些疑问:
secondary index具体是什么呢?怎么才算是secondary index?子节点具体指的是什么呢?

去primary索引去再扫一遍能理解,可是不知道secondary index到底是什么,所以不知道子节点是说的哪个,还有secondary index里到底存的是什么。

我对于这些知识了解甚少,还请多指教,给我讲解下这里这些名词的具体含义、以及他的运行机制呢?

使用道具 举报

回复
论坛徽章:
10
2011新春纪念徽章
日期:2011-02-18 11:43:362013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15双黄蛋
日期:2012-04-18 13:03:23蛋疼蛋
日期:2012-02-14 09:01:14复活蛋
日期:2012-02-01 10:04:16双黄蛋
日期:2012-01-16 14:47:262012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26优秀写手
日期:2013-12-18 09:29:12
27#
发表于 2011-11-15 18:20 | 只看该作者
除了cluster index外的index都是secondary index,因为必定引起第2次在cluster 上的搜索,所以叫secondary index

使用道具 举报

回复
论坛徽章:
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
28#
发表于 2011-11-15 18:24 | 只看该作者
txwdhs 发表于 2011-11-15 16:40
看了你之前发的关于索引的帖子,有些疑问:
secondary index具体是什么呢?怎么才算是secondary index? ...

在InnoDB存储引擎中,除了主键索引外,其余的索引就是secondary index。
主键索引有一个特别的地方,就是数据在物理磁盘上的存储顺序和主键索引的顺序一样。也就是说数据在物理磁盘上也是有序的。这里就可以得出几个结论:
1.一个表任何一个时候在磁盘上只可能有一种组织顺序,也就是主键索引只有一个。
2.如果利用主键索引的查找,效率会比较高。
主键索引分三种形式。
1>当存在主键的时候,那么这个主键索引就建在主键上
2>当主键不存在,但是存在一个列是not null约束,且这个列上有一个唯一索引(unique index),那么这个列上的索引就是主键索引
3>当前两者都不满足时,存储引擎会自动创建一个六字节的伪列,然后主键索引创建在这个伪列上。
所以,在InnoDB存储引擎中的表数据无论怎样都是有序的。

至于secondary index,就是除了刚才的哪几种情况,其余的索引都是属于secondary index。
因为如果这些索引是用b-tree实现的。而作为树形结构,在每个分支的最后一个节点(准确的说就是出度为0)就是叶子节点。在主键索引中,叶子节点存储的就是一行的所有字段。而在secondary index的叶子节点存储的只有被索引的字段+主键索引字段信息。
那么在利用这两种索引时有两种情况:
1.query需要的字段全部在被索引的字段里面(主键索引就是这样情况,因为叶子节点包括了全部字段),那么就仅仅只需要扫描这个索引就能得到需要的信息,这里也说明了利用主键索引的效率比较高。
2.如果query需要的字段信息不全在它利用的这个索引字段里面,那么它就必须去其他的文件获取,而对于secondary index, 如果query需要的字段不全在这个secondary index字段里面,那么就还必须去扫描主键索引。当然如果全部在的话,那就不必要了
比如:
有一个secondary index  idx_a_b_c在 (a ,b, c)字段上。而我一个query利用了这个索引idx_a_b_c,且需要a,b,c,d这几个字段信息。现在a,b,c在idx_a_b_c中有了,还有d需要怎么办呢? 那就只好去扫描主键索引了,而假如query利用了idx_a_b_c这个索引,且只需要a,b,c这三个字段,那么仅仅利用这个索引就能够完成了,不需要额外的I/O去扫描主键索引。

说的有些混乱,希望理解~~~

使用道具 举报

回复
论坛徽章:
0
29#
 楼主| 发表于 2011-11-16 16:54 | 只看该作者
icer_repls 发表于 2011-11-15 18:24
在InnoDB存储引擎中,除了主键索引外,其余的索引就是secondary index。
主键索引有一个特别的地方,就是 ...

谢谢你!我大体明白了,还是有个别的地方不太清楚:

3>当前两者都不满足时,存储引擎会自动创建一个六字节的伪列,然后主键索引创建在这个伪列上。
你说的这种情况,如果是这样,我从哪里能看出这个存储引擎自动建在了哪里呢?

照这么说的话,像我那种情况,我的查询是查询了主键和另外一个没有索引的字段,主键那列是走了主键索引,那另外没有索引是根据主键的那个值然后再去扫主键索引?等于是扫了2次主键索引是吗?这种情况只会在条件是多个的情况才发生吧?有点乱,不是完全理解

那要是这样的话,我的主键弄一个很多列的组合索引理论上是不是会比较好呢?我知道不可以这样做,可是我实际不是太了解具体是为什么不好?

我的问题可能比较初级,还请别见笑,谢谢!

使用道具 举报

回复
论坛徽章:
10
2011新春纪念徽章
日期:2011-02-18 11:43:362013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15双黄蛋
日期:2012-04-18 13:03:23蛋疼蛋
日期:2012-02-14 09:01:14复活蛋
日期:2012-02-01 10:04:16双黄蛋
日期:2012-01-16 14:47:262012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26优秀写手
日期:2013-12-18 09:29:12
30#
发表于 2011-11-16 17:05 | 只看该作者
本帖最后由 justlooks 于 2011-11-16 17:08 编辑

因该叫隐藏列,因为每条innodb表记录都有这个,参见我以前的文章http://bbs.chinaunix.net/thread-1728436-1-1.html

使用道具 举报

回复

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

本版积分规则 发表回复

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