MYSQL网页设计增加mysql索引的3条准绳
怀疑这些功能在MySQL5.0中的成熟性。充其量它们在MySQL中被支持的时间也就一年左右,而在MySQL学习教程其他关系型数据库中则已经存在了近10年的时间。 一,索引的主要性索援用于疾速找出在某个列中有一特定值的行。不利用索引,MySQL必需从第1笔记录入手下手然后读完全个表直到找出相干的行。表越年夜,消费的工夫越多。假如表中查询的列有一个索引,MySQL能疾速抵达一个地位往征采到数据文件的两头,没有需要看一切数据。注重假如你必要会见年夜部分行,按次读取要快很多,由于此时我们制止磁盘搜刮。
假设你用新华字典来查找“张”这个汉字,不利用目次的话,你大概要重新华字典的第一页找到最初一页,大概要花二个小时。字典越厚呢,你花的工夫就越多。如今你利用目次来查找“张”这个汉字,张的首字母是z,z开首的汉字从900多页入手下手,有了这条线索,你查找一个汉字大概只需一分钟,因而可知索引的主要性。可是索引建的是否是越多越好呢,固然不是,假如一本书的目次分红好几级的话,我想你也会晕的。
二,筹办事情
//筹办二张测试表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,单表数据太少,索引反而会影响速率
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,团结查询,子查询等多表操纵时干系字段要加索引
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易学易用。 可以动态传入参数,省却了动态SQL的拼写。 但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右) 而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~ 但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右) 换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的 习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。 一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。 groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。
页:
[1]