仓酷云

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

[学习教程] MYSQL网页设计增加mysql索引的3条准绳

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

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

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

x
怀疑这些功能在MySQL5.0中的成熟性。充其量它们在MySQL中被支持的时间也就一年左右,而在MySQL学习教程其他关系型数据库中则已经存在了近10年的时间。  一,索引的主要性
  索援用于疾速找出在某个列中有一特定值的行。不利用索引,MySQL必需从第1笔记录入手下手然后读完全个表直到找出相干的行。表越年夜,消费的工夫越多。假如表中查询的列有一个索引,MySQL能疾速抵达一个地位往征采到数据文件的两头,没有需要看一切数据。注重假如你必要会见年夜部分行,按次读取要快很多,由于此时我们制止磁盘搜刮。
  假设你用新华字典来查找“张”这个汉字,不利用目次的话,你大概要重新华字典的第一页找到最初一页,大概要花二个小时。字典越厚呢,你花的工夫就越多。如今你利用目次来查找“张”这个汉字,张的首字母是z,z开首的汉字从900多页入手下手,有了这条线索,你查找一个汉字大概只需一分钟,因而可知索引的主要性。可是索引建的是否是越多越好呢,固然不是,假如一本书的目次分红好几级的话,我想你也会晕的。
  二,筹办事情
  1. //筹办二张测试表mysql>CREATETABLE`test_t`(->`id`int(11)NOTNULLauto_increment,->`num`int(11)NOTNULLdefault0,->`d_num`varchar(30)NOTNULLdefault0,->PRIMARYKEY(`id`)->)ENGINE=MyISAMDEFAULTCHARSET=utf8AUTO_INCREMENT=1;QueryOK,0rowsaffected(0.05sec)mysql>CREATETABLE`test_test`(->`id`int(11)NOTNULLauto_increment,->`num`int(11)NOTNULLdefault0,->PRIMARYKEY(`id`)->)ENGINE=MyISAMDEFAULTCHARSET=utf8AUTO_INCREMENT=1;QueryOK,0rowsaffected(0.05sec)//创立一个存储历程,为插数据便利mysql>delimitermysql>createprocedurei_test(paint(11),tabvarchar(30))->begin->declaremax_numint(11)default100000;->declareiintdefault0;->declarerand_numint;->declaredouble_numchar;->->iftab!=test_testthen->selectcount(id)intomax_numfromtest_t;->whilei<pado->ifmax_num<100000then->selectcast(rand()*100asunsigned)intorand_num;->selectconcat(rand_num,rand_num)intodouble_num;->insertintotest_t(num,d_num)values(rand_num,double_num);->endif;->seti=i+1;->endwhile;->else->selectcount(id)intomax_numfromtest_test;->whilei<pado->ifmax_num<100000then->selectcast(rand()*100asunsigned)intorand_num;->insertintotest_test(num)values(rand_num);->endif;->seti=i+1;->endwhile;->endif;->endQueryOK,0rowsaffected(0.00sec)mysql>delimiter;mysql>showvariableslike"%pro%";//检察一下,纪录实行的profiling是否是开启动了,默许是不开启的+---------------------------+-------+Variable_nameValue+---------------------------+-------+profilingOFFprofiling_history_size15protocol_version10slave_compressed_protocolOFF+---------------------------+-------+4rowsinset(0.00sec)mysql>setprofiling=1;//开启后,是为了对照加了索引后的实行工夫QueryOK,0rowsaffected(0.00sec)
复制代码
  三,实例
  1,单表数据太少,索引反而会影响速率
  1. mysql>calli_test(10,test_t);//向test_t表拔出10前提QueryOK,1rowaffected(0.02sec)mysql>selectnumfromtest_twherenum!=0;mysql>explainselectnumfromtest_twherenum!=0G;***************************1.row***************************id:1select_type:SIMPLEtable:test_ttype:ALLpossible_keys:NULLkey:NULLkey_len:NULLref:NULLrows:10Extra:Usingwhere1rowinset(0.00sec)ERROR:Noqueryspecifiedmysql>createindexnum_2ontest_t(num);QueryOK,10rowsaffected(0.19sec)Records:10Duplicates:0Warnings:0mysql>selectnumfromtest_twherenum!=0;mysql>explainselectnumfromtest_twherenum!=0G;***************************1.row***************************id:1select_type:SIMPLEtable:test_ttype:indexpossible_keys:num_2key:num_2key_len:4ref:NULLrows:10Extra:Usingwhere;Usingindex1rowinset(0.00sec)ERROR:Noqueryspecifiedmysql>showprofiles;+----------+------------+---------------------------------------------+Query_IDDurationQuery+----------+------------+---------------------------------------------+10.00286325calli_test(10,test_t)//拔出十条数据20.00026350selectnumfromtest_twherenum!=030.00022250explainselectnumfromtest_twherenum!=040.18385400createindexnum_2ontest_t(num)//创立索引50.00127525selectnumfromtest_twherenum!=0//利用索引后,差未几是没有利用索引的0.2倍60.00024375explainselectnumfromtest_twherenum!=0+----------+------------+---------------------------------------------+6rowsinset(0.00sec)
复制代码
  注释:
  id:暗示sql实行的按次
  select_type:SIMPLE,PRIMARY,UNION,DEPENDENTUNION,UNIONRESULT,SUBQUERY,DEPENDENTSUBQUERY,DERIVED分歧的查询语句会有分歧的select_type
  table:暗示查找的表名
  type:暗示利用索引范例,大概有没有利用索引.效力从高到低const、eq_reg、ref、range、index和ALL,实在这个根你sql的写法有间接干系,比方:能用主键就用主键,where前面的前提加上索引,假如是独一加上独一索引等
  possible_keys:大概存在的索引
  key:利用索引
  key_len:利用索引的长度
  ref:利用哪一个列或常数与key一同从表当选择行,一样平常在多表团结查询时会有。
  rows:查找出的行数
  Extra:分外申明
  前段工夫写过一篇博文mysqldistinct和groupby谁更好,内里有伴侣留言,说测试了局根我事先做的测试了局纷歧样,事先我打例如注释了一下,明天偶然间,以例子的情势,更直不雅的表达出索引的事情道理。
  2,where后的前提,orderby,groupby等如许过滤时,前面的字段最好加上索引。依据实践情形,选择PRIMARYKEY、UNIQUE、INDEX等索引,可是不是越多越好,要过度。
  3,团结查询,子查询等多表操纵时干系字段要加索引
  1. mysql>calli_test(10,test_test);//向test_test表拔出10条数据QueryOK,1rowaffected(0.02sec)mysql>explainselecta.numasnum1,b.numasnum2fromtest_tasaleftjointest_testasbona.num=b.numG;***************************1.row***************************id:1select_type:SIMPLEtable:atype:indexpossible_keys:NULLkey:num_2key_len:4ref:NULLrows:10Extra:Usingindex***************************2.row***************************id:1select_type:SIMPLEtable:btype:refpossible_keys:num_1key:num_1key_len:4ref:bak_test.a.num//bak_test是数据库名,a.num是test_t的一个字段rows:1080Extra:Usingindex2rowsinset(0.01sec)ERROR:Noqueryspecified
复制代码
  数据量出格年夜的时分,最好不要用团结查询,即便你做了索引。
  下面只是团体的一点小结,举一反三一下。
<Pstyle="TEXT-INDENT:2em">
与其他数据库相比,MySQL易学易用。
透明 该用户已被删除
沙发
发表于 2015-1-19 05:52:18 | 只看该作者
可以动态传入参数,省却了动态SQL的拼写。
小魔女 该用户已被删除
板凳
发表于 2015-1-24 12:30:18 | 只看该作者
但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)
第二个灵魂 该用户已被删除
地板
发表于 2015-2-1 12:09:18 | 只看该作者
而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
精灵巫婆 该用户已被删除
5#
发表于 2015-2-7 05:05:15 | 只看该作者
但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)
山那边是海 该用户已被删除
6#
发表于 2015-2-20 14:28:14 | 只看该作者
换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的
若相依 该用户已被删除
7#
发表于 2015-3-6 18:31:30 | 只看该作者
习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。
飘飘悠悠 该用户已被删除
8#
发表于 2015-3-13 05:26:20 | 只看该作者
一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。
兰色精灵 该用户已被删除
9#
发表于 2015-3-20 14:23:17 | 只看该作者
groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-6-6 01:38

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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