仓酷云

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

[学习教程] MYSQL网站制作之MySQL如何优化WHERE子句

[复制链接]
只想知道 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:45:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
对免费版的用户也具有充足的支持服务。在dev.mysql.com上,一个大型的MySQL学习教程强大社区用户和开发者可以讨论所有关于MySQL的事情。这个站点拥有博客、指南、视频、技术交流会、白皮书和论坛等方式的交流。mysql|优化where优化次要是在SELECT中,由于他们最次要是在那边利用,可是一样的优化也可被用于DELETE和UPDATE语句。  但请注重,上面的优化并非完整的。MYSQL实行了很多优化,但我没工夫全体测试.
  MySQL的一些优化列鄙人面:
  删除不用要的括号:
((aANDb)ANDcOR(((aANDb)AND(cANDd))))
->(aANDbANDc)OR(aANDbANDcANDd)
  常数调进:
(a->b>5ANDb=cANDa=5
  删除常数前提:
(B>=5ANDB=5)OR(B=6AND5=5)OR(B=7AND5=6)
->B=5ORB=6
  索引利用的常数表达式仅盘算一次。
  在一个单个表上的没有一个WHERE的COUNT(*)间接从表中检索信息。当仅利用一个表时,对任何NOTNULL表达式也如许做。
  有效常数表达式的初期检测。MySQL疾速检测某些SELECT语句是不成能的而且不前往行。
  假如你不利用GROUPBY或分组函数(COUNT()、MIN()……),HAVING与WHERE兼并。
  为每一个子联合(subjoin),机关一个更复杂的WHERE以失掉一个更快的WHERE盘算而且也尽快跳过纪录。
  一切常数的表在查询中的在其他任何表之前被读出。
  一个常数的表是:
  一个空表或一个有1行的表。
  与在一个UNIQUE索引、或一个PRIMARYKEY的WHERE子句一同利用的表,这里一切的索引部分利用一个常数表达式而且索引部分被界说为NOTNULL。
  一切以下的表用作常数表:
mysql>SELECT*FROMtWHEREprimary_key=1;
mysql>SELECT*FROMt1,t2WHEREt1.primary_key=1ANDt2.primary_key=t1.id;
  春联结表的最好联合组合是经由过程实验一切大概性来找到:(。假如一切在ORDERBY和GROUPBY的列来自统一个表,那末当联合时,该表起首被选中。
  假如你利用SQL_SMALL_RESULT,MySQL将利用一个在内存中的表。
  假如有一个ORDERBY子句和一个分歧的GROUPBY子句,或假如ORDERBY或GROUPBY包括不是来自联合行列中的第一个表的其他表的列,创立一个一时表。
  由于DISTINCT被变更到在一切的列上的一个GROUPBY,DISTINCT与ORDERBY分离也将在很多情形下必要一张一时表。
  每一个表的索引被查询而且利用超过少于30%的行的索引。假如如许的索引没能找到,将利用一个疾速的表扫描。
  在一些情形下,MySQL能从索引中读出行,乃至不必查询数据文件。假如索引利用的一切列是数字的,那末只要索引树被用来解答查询。
  在每一个纪录被输入前,那些不婚配HAVING子句的即将被跳过。
  上面是一些疾速的查询例子:
mysql>SELECTCOUNT(*)FROMtbl_name;
mysql>SELECTMIN(key_part1),MAX(key_part1)FROMtbl_name;
mysql>SELECTMAX(key_part2)FROMtbl_name
WHEREkey_part_1=constant;
mysql>SELECT...FROMtbl_name
ORDERBYkey_part1,key_part2,...LIMIT10;
mysql>SELECT...FROMtbl_name
ORDERBYkey_part1DESC,key_part2DESC,...LIMIT10;
  以下查询仅利用索引树便可办理(假定索引列是数字的):
mysql>SELECTkey_part1,key_part2FROMtbl_nameWHEREkey_part1=val;
mysql>SELECTCOUNT(*)FROMtbl_name
WHEREkey_part1=val1ANDkey_part2=val2;
mysql>SELECTkey_part2FROMtbl_nameGROUPBYkey_part1;
  以下查询利用索引以排序按次检索,不必一次别的的排序:
mysql>SELECT...FROMtbl_nameORDERBYkey_part1,key_part2,...
mysql>SELECT...FROMtbl_nameORDERBYkey_part1DESC,key_part2DESC,...
采用DBaaS解决方案,他们也可以使用同大企业一样的技术。在大型组织中,DBaaS可以提供部门级解决MySQL学习教程,而无需IT部门和采购部门的介入,提供更快和更容易的方法来实现小型解决方案。
兰色精灵 该用户已被删除
沙发
发表于 2015-1-19 22:48:47 | 只看该作者
这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。
小魔女 该用户已被删除
板凳
发表于 2015-1-25 21:53:55 | 只看该作者
数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。
爱飞 该用户已被删除
地板
发表于 2015-2-4 06:00:07 | 只看该作者
XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!)
admin 该用户已被删除
5#
发表于 2015-2-9 16:40:22 | 只看该作者
如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。
因胸联盟 该用户已被删除
6#
发表于 2015-2-27 11:06:48 | 只看该作者
这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?
莫相离 该用户已被删除
7#
发表于 2015-3-9 01:34:43 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
飘飘悠悠 该用户已被删除
8#
发表于 2015-3-16 19:55:47 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
不帅 该用户已被删除
9#
发表于 2015-3-23 00:25:00 | 只看该作者
其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-23 02:38

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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