- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解mysql建立索引的使用办法及优缺点分析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
索引(index)是帮助MySQL高效获取数据的数据结构。 它对于高性能非常关键,但人们通常会忘记或误解它。 索引在数据越大的时候越重要。规模小、负载轻的数据库即使没有索引,也能有好的性能, 但是当数据增加的时候,性能就会下降很快.
为什么要创建索引呢?
这是因为,创建索引可以大大提高系统的性能.
第1、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性.
第2、可以大大加快数据的检索速度,这也是创建索引的最主要的原因.
第3、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义.
第4、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间.
第5、通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能.
也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点,但是,为表中的每一个列都增加索引,是非常不明智的.
这是因为,增加索引也有许多不利的一个方面
第1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加.
第2、索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大.
第3、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度.
什么样的字段适合创建索引
索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引.
一般来说,应该在这些列上创建索引,例如:
第1、在经常需要搜索的列上,可以加快搜索的速度; 。
第2、在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 。
第3、在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度; 。
第4、在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; 。
第5、在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间; 。
第6、在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度.
建立索引,一般按照select的where条件来建立,比如:select的条件是wheref1andf2,那么如果我们在字段f1或字段f2上简历索引是没有用的,只有在字段f1和f2上同时建立索引才有用等.
什么样的字段不适合创建索引
同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:
第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引, 。
并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求.
第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列, 。
在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大.
增加索引,并不能明显加快检索速度.
第三,对于那些定义为text,image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少.
第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的.
当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能.
因此,当修改性能远远大于检索性能时,不应该创建索引.
创建索引的方法
1、创建索引,例如createindex<索引的名字>ontable_name(列的列表),
2、修改表,例如altertabletable_nameaddindex[索引的名字](列的列表),
3、创建表的时候指定索引,例如createtabletable_name([...],INDEX[索引的名字](列的列表)),
查看表中索引的方法
showindexfromtable_name;查看索引 。
索引的类型及创建例子
1.PRIMARYKEY(主键索引) 。
1
|
mysql>altertabletable_nameaddprimarykey(`
column
`)
|
2.UNIQUE或UNIQUEKEY(唯一索引) 。
1
|
mysql>altertabletable_nameaddunique(`
column
`)
|
3.FULLTEXT(全文索引) 。
1
|
mysql>altertabletable_nameaddfulltext(`
column
`)
|
4.INDEX(普通索引) 。
1
|
mysql>altertabletable_nameaddindexindex_name(`
column
`)
|
5.多列索引(聚簇索引) 。
1
|
mysql>altertable`table_name`addindexindex_name(`column1`,`column2`,`column3`)
|
修改表中的索引:
1
|
altertabletablenamedropprimarykey,addprimarykey(fileda,filedb)
|
总结 。
有了索引,对于记录数量很多的表,可以提高查询速度。但是索引是占用空间的,所以在建立索引的时候可以根据本文来参考,或许对你有所帮助.
最后此篇关于详解mysql建立索引的使用办法及优缺点分析的文章就讲到这里了,如果你想了解更多关于详解mysql建立索引的使用办法及优缺点分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
这几天我一直在努力。我一直在自学 CSS,所以对菜鸟好一点。我正在创建一个推荐 slider 。推荐以 3 个 block 显示。我希望前 2 个下降,第 3 个上升。但是当 slider 激活时,无
我最近开始学习 Nodejs,现在我很困惑我的网络应用程序使用什么,html 还是 ejs (Express)。 Ejs 使用 Express 模块,而 .html 使用 HTML 模块。我的第一个问
假设我们有一个 PostgreSQL 表contacts,每条记录都有一堆带标签的电子邮件地址(标签和电子邮件对)——其中一个是“主要”。 存储方式如下: id 主键 电子邮件 文本 email_la
我成功为一种新的tesseract语言编写了traineddata文件,但是当我完成时,我继续收到以下错误: index >= 0 && index = 0 && 索引 < size_used_ :E
这个问题已经有答案了: How to deal with SettingWithCopyWarning in Pandas (21 个回答) 已关闭 4 年前。 假设我有一个像这样的数据框,第一列“密
如果我有一个位置或行/列同时用于 A 和 B 位置,请检查 B 是否与 A 成对角线? 1 2 3 4 5 6 7 8 9 例如,我如何检查 5 是否与 7 成对角线? 此外,如果我检查 4 是
MongoDB:索引 一、 创建索引 默认情况下,集合中的_id字段就是索引,我们可以通过getIndexes()方法来查看一个集合中的索引 > db.user.getIndexes() [ { "v
一、索引介绍 索引是一种用来快速查询数据的数据结构。 B+Tree就是一种常用的数据库索引数据结构,MongoDB采用B+Tree 做索引,索引创建在colletions上。 MongoDB不使用索引
我无法决定索引。 就像我有下面的查询需要太多时间来执行: select count(rn.NODE_ID) as Count, rnl.[ISO_COUNTRY_CODE] as Cou
我有这些表: CREATE TABLE `cstat` ( `id_cstat` bigint(20) NOT NULL, `lang_code` varchar(3) NOT NULL,
我正在尝试找到一种方法来提高包含 IP 范围的 mysql 表的性能(在高峰时段每秒最多有 500 个 SELECT 查询(!),所以我有点担心)。 我有一个这种结构的表: id smallint(
jquery index() 似乎无法识别元素之一,总是说“无法读取未定义的属性‘长度’”这是我的代码。mnumber 是导致问题的原因。我需要 number 和 mnumber 才能跟踪使用鼠标,并
我们有一个包含近 4000 万条记录的 MongoDB 集合。该集合的当前大小为 5GB。此集合中存储的数据包含以下字段: _id: "MongoDB id" userid: "user id" (i
文档说:如果你有多个字段的复合索引,你可以用它来查询字段的开始子集。所以如果你有一个索引一个,乙,丙你可以用它查询一种一个,乙a,b,c 我的问题是,如果我有一个像这样的复合索引一个,乙,丙我可以查询
我正在使用 $('#list option').each(function(){ //do stuff }); 循环列表中的选项。我想知道如何获取当前循环的索引? 因为我不想让 var i = 0;循
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL
SQLite 索引(Index) 索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书后边的索引是非常相似的。
我是 RavenDB 的新手。我正在尝试使用多 map 索引功能,但我不确定这是否是解决我的问题的最佳方法。所以我有三个文件:Unit、Car、People。 汽车文件看起来像这样: { Id: "
我有以下数据,我想根据范围在另一个表中建立索引 我想要实现的是,例如,如果三星的销售额为 2500,则折扣为 2%,低于 3000 且高于 1000 我知道它可以通过索引来完成,与多个数组匹配,然后指
我正在检查并删除 SQL 数据库中的重复和冗余索引。 所以如果我有两个相同的索引,我会删除。 例如,如果我删除了重叠的索引... 索引1:品牌、型号 指标二:品牌、型号、价格 我删除索引 1。 相同顺
我是一名优秀的程序员,十分优秀!