首先索引存在的目的是让你快速检索到你想要的数据。
举一个大家都经常使用的例子。你小学的时候使用的字典。如果你想查询一个字的详细信息:读音、释义、组词等信息。你会根据它的偏旁部首或者拼音的首字母这样先在字典的前面索引页面查到这个字在字典的第几页,然后直接翻到对应的页面就可以查询到你想要查询的字。相比上面的步骤,如果你没有索引页,字典中的汉字都是随机存放的,没有任何顺序可言,而此时如果你直接去翻字典中的每一页,挨个的查找,直到找到你想要的字,犹如大海捞针,很慢很费劲。
不知道这样的例子你能否理解。
集合上面的例子,你可以把汉字的读音、释义、组词等信息看做数据表中多个列中的值。汉字呢就相当于是表中数据的主键值。
有的时候,索引并不能存储很多的数据内容,比如汉字,你当然可以把汉字的读音、释义、祖册等各种信息全部放在索引页面中,但是这样就导致了你此时的索引页面会比正常只存储偏旁或者拼音的索引页,多存储很多信息,此时的索引页就会比较庞大,多出很多的存储页。这样你去查询索引页的时候,原本翻1-3页就可以定位到要查询的汉字在第几页,现在你可能要翻10-30页才能查询到你的汉字信息。效率没有比索引页面中单独只存储偏旁部首或者拼音,具体信息单独存在字典后面的某一个页面中的方式高。所以,索引和数据分开。
上面的例子中,汉字只是有读音、释义、词组三个信息。如果有更多的信息呢?比如一个汉字的解释需要一页纸或者两页值。此时的信息如果都放在索引页面中存放,那么将导致索引页更大。
以上就是基本的原理。为什么要用索引,索引中为什么不都存放所有的信息。
mysql数据库可以为视图创建索引,创建方法为:
1、在mysql数据库中为数据表创建索引时,可在创建表的时候直接创建索引,如下图创建普通索引。
2、通过explain命令可以查看正在被使用的索引。
3、另外还可以创建唯一索引,唯一索引要求被约束列的值是唯一值,不能重复。
4、如果唯一索引列的值在创建时出现重复是无法正常插入的,如下图。
5、另外还可以通过multiidx在同一个表中创建复合索引,如下图。
6、在已经存在的表上,也可以直接通过create来添加索引,如下图。
应该建索引的字段:1经常作为查询条件的字段2外键3经常需要排序的字段4分组排序的字段
应该少建或者不建索引的字段有:1表记录太少,2经常需要插入,删除,修改的表,3表中数据重复且分布平均的字段
一些SQL的写法会限制索引的使用:1where子句中如果使用in、or、like、!=,均会导致索引不能正常使用,将""换成">and=chr(0)";2使用函数时,该列就不能使用索引。3比较不匹配数据类型时,该索引将会被忽略。
一些SQL语句优化的写法:1如果from是双表的查询时,大表放在前面,小表放在后面(基础表)。最后面的表是基础表。(只在基于规则的优化器中有效)2如果三表查询时,选择交叉表(table)作为基础表(只在基于规则的优化器中有效)3写where条件时,有索引字段的判断在前,其它字段的判断在后;如果where条件中用到复合索引,按照索引列在复合索引中出现的顺序来依次写where条件;4查询数量较大时,使用表连接代替IN,EXISTS,NOTIN,NOTEXISTS等。5ORACLE采用自下而上的顺序解析WHERE子句,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾
大部分开发会了解这样的《开发规范》:创建索引要选择区分度高的字段。他们会认为区分度低的字段不适合创建索引或者不适合添加到组合索引里面。但是这样的 *** 作会导致很多慢查。举例来说:
select from tab where a=1 and b=2;
场景 1
符合 a=1的记录数有 10w 条记录 ,b=2 有 1000 条记录。如果只是创建idx_a(a),sql 请求通过索引idx_a访问 10w 条件记录,然后还要逐一匹配 10w 条记录中的 status,找到符合 b=2的记录。这个动作会导致慢查。如果创建组合索引idx_ab(a,b),sql 请求通过索引idx_ab可以直接定位到 1000 条记录,无需额外的过滤。这样减少访问 9900 条记录的时间,提升查询速度。
场景 2
符合 a=1的有 100 条记录,status=2 有 10 条记录。其实场景 2 因为数据量比较少,直接访问 100 条记录和定位到 10 条记录的时间消耗相差不大,量变不足以引发质变,可以忽略了。
Tips:
创建索引的目的是通过索引尽可能找到匹配 where 条件的行,减少不必要的回表,提高查询效率;
需要辩证地看待区分度比较低的字段在组合索引中的作用。在组合索引的情况下,我们不能只是单纯地看字段的区分度,而是要看符合条件的记录数是多少。符合条件的记录越少,性能越好。
以上就是关于为什么要为数据库建立索引全部的内容,包括:为什么要为数据库建立索引、mysql数据库是否可以为视图创建索引,可以的话,请问如果创建、数据库创建索引后怎么使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)