首页 > 试题广场 >

为了提高数据的查询效率,需要在数据库中建立索引,则下列设计索

[不定项选择题]
为了提高数据的查询效率,需要在数据库中建立索引,则下列设计索引的原则描述正确的是()
  • 在频繁进行排序或分组(即进行group by 或order by操作)的列上建立索引
  • 考虑列中值的分布,列的基数越大,索引的效果越好
  • 在select关键字后选择列表的列上,建立索引
  • 在表中,索引越多越好
http://blog.itpub.net/29272216/viewspace-1243730/

1、   表的某个字段值得离散度越高,该字段越适合选作索引的关键字。主键字段以及唯一性约束字段适合选作索引的关键字,原因就是这些字段的值非常离散。尤其是在主键字段创建索引时, cardinality (基数,集的势)的值就等于该表的行数。 MySQL 在处理主键约束以及唯一性约束时,考虑周全。数据库用户创建主键约束的同时, MySQL 自动创建主索引( primary index ),且索引名称为 Primary ;数据库用户创建唯一性索引时, MySQL 自动创建唯一性索引( unique index ),默认情况下,索引名为唯一性索引的字段名。

2、   占用存储空间少的字段更适合选作索引的关键字。例如,与字符串相比,整数字段占用的存储空间较少,因此,较为适合选作索引关键字。

3、   存储空间固定的字段更适合选作索引的关键字。与 text 类型的字段相比, char 类型的字段较为适合选作索引关键字。

4、   Where 子句中经常使用的字段应该创建索引,分组字段或者排序字段应该创建索引,两个表的连接字段应该创建索引。

5、   更新频繁的字段不适合创建索引,不会出现在 where 子句中的字段不应该创建索引。

6、   最左前缀原则。

7、   尽量使用前缀索引。

发表于 2016-04-10 16:41:27 回复(6)
编辑于 2016-09-06 22:08:31 回复(0)
列的指应改为列的值
发表于 2016-07-19 21:33:36 回复(4)
列的基数是指列中不重复数值的个数。
发表于 2016-12-02 19:46:26 回复(2)
关于B选项,比如,放置生日的列具有很多不同的值,就很容易区分各行,而用来记录性别的列,只含有男女两三个选项,在此设立索引就没有什么意义。(网上copy来的例子)

关于C选项,索引的设计原则之一应该是:为经常作为查询条件的字段建立索引,而非只要是select的字段就进行索引。
发表于 2019-03-29 13:10:23 回复(0)

创建索引虽然可以提高查询速度,但是它是牺牲一定的系统性能。因此,在创建时,哪些列适合创建索引,哪些列不适合创建索引,需要进行判断,具体以下原则:

<1>. 有主键的数据列要建立索引。因为主键可以加速定位到表中的某一行。

<2>. 有外键的数据列要建立索引。外键列通常用于表与表之间的连接,在其上创建索引可以加快表间的连接。

<3>. 对于经常查询的数据列最好建立索引。

A. 对于需要在指定范围内快速或频繁查询的数据列,因为索引已经排序,其指定的范围是连续的,查询可以利用索引的排序,加快查询的时间。

B. 经常用在WHERE子句中的数据列,将索引建立在WHERE子句的集合过程中,对于需要加速或频繁检索的数据列,可以让这些经常参与查询的数据列按照索引的排序进行查询,加快查询的时间。

<4>. 对于那些查询中很少涉及的列、重复值比较多的列不要建立索引。

例如,在查询中很少使用的列,有无索引并不能提高查询的速度,相反增加了系统维护时间和消耗了系统空间。

<5>. 对于定义为textimagebit数据类型的列不要建立索引。因为这些数据类型的数据列的数据量要么很大、要么很小,不利于使用索引。

发表于 2016-10-12 16:17:42 回复(0)
AB
发表于 2016-05-03 19:47:02 回复(0)

1.最适合索引的列是出现在 WHERE子句中的列,或连接子句中指定的列,而不是出现在 SELECT 关键字后的选择列表中的列。
使用惟一索引。考虑某列中值的分布。索引的列的基数越大,索引的效果越好。

例如,存放出生日期的列具有不同值,很容易区分各行。而用来记录性别的列,只含有“ M”
和“F”,则对此列进行索引没有多大用处,因为不管搜索哪个值,都会得出大约一半的行。

2.如果对字符串列进行索引,应该指定一个前缀长度,只要有可能就应该这样做。

例如,如果有一个 CHAR(200)列,如果在前 10 个或 20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。对前 10 个或 20 个字符进行索引能够节省大量索引空间,也可能会使查询更快。较小的索引涉及的磁盘 IO 较少,较短的值比较起来更快。更为重要的是,对于较短的键值,索引高速缓存中的块能容纳更多的键值,因此,MySQL 也可以在内存中容纳更多的值。这样就增加了找到行而不用读取索引中较多块的可能性。

 3.利用最左前缀。

在创建一个 n 列的索引时,实际是创建了 MySQL 可利用的 n 个索引。多列索引可起几个索引的作用,因为可利用索引中最左边的列集来匹配行。这样的列集称为最左前缀。

4.不要过度索引。

不要以为索引“越多越好”,什么东西都用索引是错误的。每个额外的索引都要占用额外的磁盘空间,并降低写操作的性能。在修改表的内容时,索引必须进行更新,有时可能需要重构,因此,索引越多,所花的时间越长。如果有一个索引很少利用或从不使用,那么会不必要地减缓表的修改速度。此外,MySQL 在生成一个执行计划时,要考虑各个索引,这也要花费时间。创建多余的索引给查询优化带来了更多的工作。索引太多,也可能会使 MySQL 选择不到所要使用的最好索引。只保持所需的索引有利于查询优化。

5.对于 InnoDB 存储引擎的表,记录默认会按照一定的顺序保存,

如果有明确定义的主键,则按照主键顺序保存。

如果没有主键,但是有唯一索引,那么就是按照唯一索引的顺序保存。
如果既没有主键又没有唯一索引,那么表中会自动生成一个内部列,按照这个列的顺序保存。
按照主键或者内部列进行的访问是最快的,所以 InnoDB 表尽量自己指定主键,当表中同时有几个列都是唯一的,都可以作为主键的时候,
要选择最常作为访问条件的列作为主键,提高查询的效率。

另外,还需要注意,InnoDB 表的普通索引都会保存主键的键值,所以主键要尽可能选择较短的数据类型,可以有效地减少索引的磁盘占用,提高索引的缓存效果。

发表于 2019-11-27 17:23:43 回复(0)
c为什么不可以,覆盖索引啊??????
发表于 2016-09-01 16:08:05 回复(2)
这个列的基数说的太高大上的,道理是懂的,有点恶心人非要这么说
发表于 2025-02-18 23:28:14 回复(0)
对于需要在指定范围内快速或频繁查询的数据列,因为索引已经排序,其指定的范围是连续的,查询可以利用索引的排序,加快查询的时间。
发表于 2021-07-06 13:11:12 回复(0)
C项应该是
在select关键字后选择列表的经常出现的列上,建立索引

发表于 2018-03-29 09:17:14 回复(0)
发表于 2017-10-04 14:55:38 回复(0)
select后面的值添加索引,不是最好的选择
发表于 2017-03-17 22:17:49 回复(0)