Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么以及在何处使用索引-优缺点_Mysql_Sql_Select_Indexing - Fatal编程技术网

Mysql 为什么以及在何处使用索引-优缺点

Mysql 为什么以及在何处使用索引-优缺点,mysql,sql,select,indexing,Mysql,Sql,Select,Indexing,我对数据库编程相当陌生,我想知道索引的负面影响是什么?据我所知,索引加快了必须在数据库中搜索特定值(例如SELECT)的操作 考虑这个例子: 对于表示例,在列用户名上有索引,操作: SELECT TestField FROM Example WHERE user_name=XXXX 由于索引的缘故,速度会更快 我的问题是:使用索引的缺点是什么?如果一个索引只是给我们提供了优点(性能提升),为什么不将它们设置为默认值呢?取决于索引的使用方式,但本质上它们是每个表行的唯一标识符,通常递增一个值,例

我对数据库编程相当陌生,我想知道索引的负面影响是什么?据我所知,索引加快了必须在数据库中搜索特定值(例如SELECT)的操作

考虑这个例子:

对于表
示例
,在列
用户名
上有索引,操作:

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答案:)