Mysql 为什么以及在何处使用索引-优缺点
我对数据库编程相当陌生,我想知道索引的负面影响是什么?据我所知,索引加快了必须在数据库中搜索特定值(例如SELECT)的操作 考虑这个例子: 对于表Mysql 为什么以及在何处使用索引-优缺点,mysql,sql,select,indexing,Mysql,Sql,Select,Indexing,我对数据库编程相当陌生,我想知道索引的负面影响是什么?据我所知,索引加快了必须在数据库中搜索特定值(例如SELECT)的操作 考虑这个例子: 对于表示例,在列用户名上有索引,操作: SELECT TestField FROM Example WHERE user_name=XXXX 由于索引的缘故,速度会更快 我的问题是:使用索引的缺点是什么?如果一个索引只是给我们提供了优点(性能提升),为什么不将它们设置为默认值呢?取决于索引的使用方式,但本质上它们是每个表行的唯一标识符,通常递增一个值,例
示例
,在列用户名
上有索引,操作:
SELECT TestField FROM Example WHERE user_name=XXXX
由于索引的缘故,速度会更快
我的问题是:使用索引的缺点是什么?如果一个索引只是给我们提供了优点(性能提升),为什么不将它们设置为默认值呢?取决于索引的使用方式,但本质上它们是每个表行的唯一标识符,通常递增一个值,例如:
mytable{
index | name | m/f | age
1 | bob | male | 22 |
2 | joe b | male | 27 |
3 | sam | female | 42 |
4 | bef | female | 21 |
}
看看我们如何检查数字3中的“sam”,而不是检查每一个表、每一行和每一列。好吧,您可能可以填写有关索引的书籍,但简而言之,在创建索引时需要考虑以下几点: 虽然它(主要)加快了select的速度,但它减慢了插入、更新和删除的速度,因为数据库引擎不必只写入数据,还需要写入索引。 索引需要RAM中的硬盘空间(更重要的是)。不能保存在RAM中的索引是非常无用的。 只有几个不同值的列上的索引不会加快选择速度,因为它不能对很多行进行排序(例如“性别”列,它通常只有两个不同的值-男性、女性)
例如,如果您使用MySQL,您可以通过在select之前添加“explain”来检查引擎是否使用索引-对于上面的示例
explain select测试字段,示例中的username=XXXX
索引用于什么,它们在数据库中是什么?
如果列user\u name
上没有索引,系统将不得不逐行扫描整个Example
表,以找到所有匹配的条目。如果特定表中的数据分布指向只有几行左右,那么这显然是获取这些行的低效方法
但是,当使用索引时,您将搜索功能重定向到一个不同的树结构,该结构具有更快的查找速度和非常小的深度
请记住,索引是纯冗余的。数据库索引就像一本电话簿,一本或任何其他您可能愿意阅读的书中的索引(可能是其中的一部分,以便快速找到您要查找的内容)
如果你对一本书的某个章节感兴趣,索引可以让你相对快速地找到它,这样你就不必浏览很多页面就能找到它
为什么不在默认情况下创建索引?
索引是一种数据结构,它与表一起创建,并在表发生更改时进行自我维护。它的存在意味着数据存储的使用
如果您对一个大表上的每一列都建立索引,那么保存索引所需的存储空间将远远超过表本身的大小
索引结构的自我维护还意味着每当发生更新、插入、删除时,都必须更新索引(这是自动完成的,不需要您的操作),但会花费时间,这意味着这些操作执行得较慢
在某些情况下,当您需要检索大多数表(例如90%的行将在输出中)或整个表时,在这种情况下,对整个表的顺序扫描(没有索引的行为)将比执行树遍历和叶节点链(导航索引树结构的行为)更有效.我们不使用索引作为默认值的主要原因是维护问题。
i、 e当我们通常更新(插入、删除或更新)表中索引的特定列时,必须动态更新索引,这是一个有点耗时的过程。此外,维护此索引会增加开销。相关问题,可能重复:索引不是免费的。它们必须被构建和更新,因此插入和更新会比较慢。试着在这里问同样的问题:请澄清这是如何回答这个问题的?我提供了一套快速的基本原理,检查Stefan P答案:)