仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 713|回复: 8
打印 上一主题 下一主题

[学习教程] 绝无经由的由浅进深解说MySQL数据库索引的挑选性

[复制链接]
谁可相欹 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 20:13:53 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
列举选择MySQL的理由的最困难的地方在于,如何对这些理由进行排序。MySQL学习教程这就如同我们经常争论的故事:先有鸡还是先有蛋?在MySQL中,关于索引的利用并是一向都接纳准确的决意。<Pstyle="TEXT-INDENT:2em">复杂表的示例:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">CREATETABLE`r2`(<Pstyle="TEXT-INDENT:2em">ID`int(11)DEFAULTNULL,<Pstyle="TEXT-INDENT:2em">ID1`int(11)DEFAULTNULL,<Pstyle="TEXT-INDENT:2em">CNAME`varchar(32)DEFAULTNULL,<Pstyle="TEXT-INDENT:2em">KEY`ID1`(`ID1`)<Pstyle="TEXT-INDENT:2em">)ENGINE=MyISAMDEFAULTCHARSET=latin1<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">SELECTCOUNT(*)FROMr2;<Pstyle="TEXT-INDENT:2em">250001(V1)<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">SELECTCOUNT(*)FROMr2WHEREID1=1;<Pstyle="TEXT-INDENT:2em">83036(V2)<Pstyle="TEXT-INDENT:2em">(executiontime=110ms)<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">(ID1=1)前提查询索引的选择性是V2/V1=0.3321或33.21%<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">一样平常来讲(比方书“SQLTuning“),假如选择性凌驾20%那末全表扫描比利用索引功能更优。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">我晓得Oracle一向是在选择性凌驾25%时会选择全表扫描。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">而MySQL呢:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">mysql>EXPLAINSELECTCOUNT(SUBNAME)FROMr2WHEREID1=1;<Pstyle="TEXT-INDENT:2em">+----+-------------+-------+------+---------------+-----<Pstyle="TEXT-INDENT:2em">|id|select_type|TABLE|type|possible_keys|KEY|key_len|ref|rows|Extra|<Pstyle="TEXT-INDENT:2em">+----+-------------+-------+------+---------------+-----<Pstyle="TEXT-INDENT:2em">|1|SIMPLE|t2|ref|ID1|ID1|5|const|81371|USINGWHERE|<Pstyle="TEXT-INDENT:2em">+----+-------------+-------+------+---------------+-----<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">这就是MySQL将会利用索引来完成这个查询。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">让我们来对照索引查询和全表扫描的实行工夫:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">SELECTCOUNT(SUBNAME)FROMt2WHEREID1=1-410ms<Pstyle="TEXT-INDENT:2em">SELECTCOUNT(SUBNAME)FROMt2IGNOREINDEX(ID1)WHEREID1=1-200ms<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">如你所看到全表扫描要快2倍。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">参考更特别的例子:选择性~95%:<Pstyle="TEXT-INDENT:2em">SELECTcnt2/cnt1FROM(SELECTcount(*)cnt1FROMr2)d1,(SELECTcount(*)cnt2FROMr2WHEREID1=1)d2;<Pstyle="TEXT-INDENT:2em">0.9492=94.92%;<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">申明MySQL将会用索引来完成查询。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">实行工夫:<Pstyle="TEXT-INDENT:2em">SELECTCOUNT(SUBNAME)FROMt2WHEREID1=1-1200ms<Pstyle="TEXT-INDENT:2em">SELECTCOUNT(SUBNAME)FROMt2IGNOREINDEX(ID1)WHEREID1=1-260ms<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">此次全表扫描要快4.6倍。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">为何MySQL选择索引会见查询?<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">MySQL没有盘算索引的选择性,只是展望逻辑IO操纵的数目,而且我们的例子两头的逻辑IO数目,索引会见要少于全表扫描。<Pstyle="TEXT-INDENT:2em">最初我们得出结论,关于索引要当心利用,由于它们其实不能匡助一切的查询。
对免费版的用户也具有充足的支持服务。在dev.mysql.com上,一个大型的MySQL学习教程强大社区用户和开发者可以讨论所有关于MySQL的事情。这个站点拥有博客、指南、视频、技术交流会、白皮书和论坛等方式的交流。
兰色精灵 该用户已被删除
9#
发表于 2015-3-24 00:10:16 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
冷月葬花魂 该用户已被删除
8#
发表于 2015-3-17 06:18:45 | 只看该作者
我个人认为就是孜孜不懈的学习
乐观 该用户已被删除
7#
发表于 2015-3-10 09:25:39 | 只看该作者
你可以简单地认为适合的就是好,不适合就是不好。
灵魂腐蚀 该用户已被删除
6#
发表于 2015-2-28 22:31:23 | 只看该作者
如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录.
飘飘悠悠 该用户已被删除
5#
发表于 2015-2-10 05:58:22 | 只看该作者
只能告诉你,学好数据库语言和原理,多见识几种数据库软件,比一棵树上吊死要好。
若相依 该用户已被删除
地板
发表于 2015-2-4 18:50:30 | 只看该作者
其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!
精灵巫婆 该用户已被删除
板凳
发表于 2015-1-26 14:06:57 | 只看该作者
大侠们有推荐的书籍和学习方法写下吧。
小妖女 该用户已被删除
沙发
发表于 2015-1-18 18:53:38 | 只看该作者
以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 10:51

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表