设为首页 加入收藏

TOP

干货分享:DBA专家门诊一期:索引与sql优化问题汇总(二)
2015-07-24 11:55:24 来源: 作者: 【 】 浏览:16
Tags:干货 分享 DBA 专家门诊 一期 索引 sql 优化 问题 汇总
究,那么在深处,你会发现,这些面逐渐接合,慢慢的延伸到oracle的所有层面,逐渐的你就能融会贯通。这时候,你会主动的去尝试全面学习Oracle,扫除你的知识盲点,学习已经成为一种需要。
由实践触发的学习才最有针对性,才更能让你深入的理解书本上的知识,正所谓:"纸上得来终觉浅,绝知此事要躬行"。实践的经验于我们是至为宝贵的。
如果说有,那么这,就是我的捷径。
想想自己,经常是"每有所获,便欣然忘食",兴趣才是我们最好的老师。
Oracle的优化是一门学问,也是一门艺术,理解透彻了,你会知道,优化不过是在各种条件之下做出的均衡与折中。
内存、外存;CPU、IO...对这一切你都需要有充分的认识和相当的了解,管理数据库所需要的知识并不单纯。
作为一个数据库管理人员,你需要做的就是能够根据自己的知识以及经验在各种复杂情况下做出快速正确的判断。当问题出现时,你需要知道使用怎样的手段发现问题的根本;找到问题之后,你需要运用你的知识找到解决问题的方法。
这当然并不容易,举重若轻还是举轻若重,取决于你具备怎样的基础以及经验积累。
在网络上,Howard J. Rogers最近创造了一个新词组:Voodoo Tuning,用以形容那些没有及时更新自己的知识技能的所谓的Oracle技术专家。由于知识的陈旧或者理解的肤浅,他们提供的很多调整建议是错误的、容易使人误解的,甚至是荒诞的。他们提供的某些建议在有些情况下也许是正确的,如果你愿意回到Oracle5版或者6版的年代;但是这些建议在Oracle7.0,8.0 或者 Oracle8i以后往往是完全错误的。
后来基于类似问题触发了互联网内Oracle顶级高手的一系列深入讨论,TOM、Jonathan Lewis、HJR等人都参与其中,在我的网站上(www.eygle.com )上对这些内容及相关链接作了简要介绍,有兴趣的可以参考。
HJR给我们提了很好的一个提示:对你所需要调整的内容,你必须具有充分的认识,否则你做出的判断就有可能是错误的。
这也是我想给自己和大家的一个建议:学习和研究Oracle,严谨和认真必不可少。
当然你还需要勤奋,我所熟悉的在Oracle领域有所成就的技术人员,他们共同的特点就是勤奋。
如果你觉得掌握的东西没有别人多,那么也许就是因为,你不如别人勤奋。
要是你觉得这一切过于复杂了,那我还有一句简单的话送给大家:不积跬步,无以至千里。学习正是在逐渐积累过程中的提高。
现在Itpub给我们提供了很好的交流场所,很多问题都可以在这里找到答案,互相讨论,互相学习。这是我们的幸运,我也因此非常感谢这个网络时代。
参考书籍:如果是一个新人可以先买一些基本的入门书籍,比如MySQL:《深入浅出MySQL――数据库开发、优化与管理维护》,在进阶一点的就是《高性能MySQL(第3版)》
oracle的参考书籍:http://www.eygle.com/archives/2006/08/oracle_fundbook_recommand.html
最后建议不要在数据库中使用外键,让应用程序来保证。

千鸟(Q3):我有一个问题想问问,现在在做一个与图书有关的项目,其中有一个功能是按图书书名搜索相似图书列表,问题不难,但是想优化一下,有如下问题想请教一下:
1、在图书数据库数据表的书名字段里,按图书书名进行关键字搜索,如何快速搜索相关的图书? 现在由于数据不多,直接用的like模糊查找验证功能而已;
2、如何按匹配的关键度进行快速排序?比如搜索“算法”,有一本书是《算法》,另一本书是《算法设计》,要求前者排在更前面。现在的排序是根据数据表中的主键序号id进行的排序,没有达到想要的效果。 谢谢了~~~~ ^_^
玄惭(A3): 1、如果数据量不大,是可以在数据库中完成搜索的,可以在搜索字段上创建索引,然后进行搜索查询:
CREATE TABLE `book` (
`book_id` int(11) NOT NULL AUTO_INCREMENT,
`book_name` varchar(100) NOT NULL,
.............................
PRIMARY KEY (`book_id`),
KEY `ind_name` (`book_name`)
) ENGINE=InnoDB
select book.* from book , (select book_id from book where book_name like '%算法%') book_search_id where book.book_id=book_search_id.book_id;
但是当数据量变得很大后,就不在适合了,可以采用一些其他的第三方搜索技术比如sphinx;
2、root@127.0.0.1 : test 15:57:12> select book_id,book_name from book_search where book_name like '%算%' order by book_name;
+---------+--------------+
| book_id | book_name |
+---------+--------------+
| 2 | 算法 |
| 1 | 算法设计 |

大黑豆(Q4):请教一下有关模糊查询的优化,有没有什么比较成熟的好的策略?
玄惭(A4):模糊查询分为半模糊和全模糊,也就是:
select * from book where name like 'xxx%';(半模糊)
select * from book where name like '%xxx%';(全模糊)
半模糊可以可以使用到索引,全模糊在上面场景是不能使用到索引的,但可以进行一些改进,比如:
select book.* from book , (select book_id from book where book_name like '%算法%') book_search_id
where book.book_id=book_search_id.book_id;
注意这里book_id是主键,同时在book_name上创建了索引
上面的sql语句可以利用全索引扫描来完成优化,但是性能不会太好;特别在数据量大,请求频繁的业务场景下不要在数据库进行模糊查询;
非得使用数据库的话 ,建议不要在生产库进行查询,可以在只读节点进行查询,避免查询造成主业务数据库的资源消耗完,导致故障.
可以使用一些开源的搜索引擎技术,比如sphinx.

蓝色之鹰(Q5):难得大师出现。我想问下,sql优化一般从那几个方面入手?多表之间的连接方式:Nested Loops,Hash Join 和 Sort Merge Join,是不是Hash Join最优连接?
玄惭(A5):SQL优化需要了解优化器原理,索引的原理,表的存储结构,执行计划等,可以买一本书来系统的进行学习,多多实验;
不同的数据库优化器的模型不一样,比如oracle支持NL,HJ,SMJ,但是mysql只支持NL,不通的连接方式适用于不同的应用场景;
NL:对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择
HJ:对于列连接是做大数据集连接时的常用方式
SMJ:通常情况下散列连接的效果都比排序合并连接要好,然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时排序合并连接
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇随机森林和GBDT的学习 下一篇10g下修改RAC地址

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Announcing October (2025-12-24 15:18:16)
·MySQL有什么推荐的学 (2025-12-24 15:18:13)
·到底应该用MySQL还是 (2025-12-24 15:18:11)
·进入Linux世界大门的 (2025-12-24 14:51:47)
·Download Linux | Li (2025-12-24 14:51:44)