Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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 - Fatal编程技术网

Mysql 如果我将表用于只读,那么为查询中使用的每一列编制索引是否好?

Mysql 如果我将表用于只读,那么为查询中使用的每一列编制索引是否好?,mysql,sql,Mysql,Sql,这可能很愚蠢,但我想知道 我有一个只读的数据库,我不做任何插入 索引查询中使用的每一列是否明智?如果是这样,我是否应该同时为asc和desc创建索引?MySQL当前会忽略索引上的asc和desc。它接受语法,但只创建升序索引:- 索引列名称规范可以以ASC或DESC结尾 关键字允许用于将来的扩展以指定升序 或递减索引值存储。目前,它们已被解析,但 忽略;索引值始终按升序存储 索引确实会增加插入时间,但如果不进行插入,则这不是问题。它们确实增加了表的大小,但对于大多数常见的表来说,这可能不是一个

这可能很愚蠢,但我想知道

我有一个只读的数据库,我不做任何插入


索引查询中使用的每一列是否明智?如果是这样,我是否应该同时为asc和desc创建索引?

MySQL当前会忽略索引上的asc和desc。它接受语法,但只创建升序索引:-

索引列名称规范可以以ASC或DESC结尾 关键字允许用于将来的扩展以指定升序 或递减索引值存储。目前,它们已被解析,但 忽略;索引值始终按升序存储

索引确实会增加插入时间,但如果不进行插入,则这不是问题。它们确实增加了表的大小,但对于大多数常见的表来说,这可能不是一个主要问题

然而,MySQL在查询中对一个表只使用1个索引。因此,如果每个字段都有一个索引,那么查询将只使用其中一个索引。如果您的表包含(作为示例)每个员工每月1行的工资单详细信息,并且您在员工id上有一个索引,并且该月只使用其中一个,尽管如果合并,这对于记录来说是唯一的。为此,您需要覆盖多个列的索引,并且所有的组合都可以是相当多的索引

任何大的文本字段都不值得使用普通索引进行索引(全文索引可能有用,具体取决于您查询数据的方式)。对于这些,您要么需要检查字段的整个值,要么检查字段开头的值(如果使用LIKE)。如果查询某个_字段(如“%something%”)的位置,则不会使用索引


总的来说,将有用的内容编入索引,忽略其余部分。

在几乎所有情况下,这都是一个坏主意

您需要了解将对您的数据运行何种查询。然后,您可以制定一个最佳的索引策略

如果在大多数或所有查询中使用了某些列(运算符要进行基于索引的优化),并且这些列具有很高的基数(许多不同的值,分布均匀),则应为它们编制索引

基数低或分布差的列以及仅用于同时使用另一个高基数索引或根本不用于选择的查询中的列不应编制索引

相反,您应该考虑制作一些索引化合物(包括一个以上的列),这样您的最关键的查询只能使用索引中的列来实现。根据我的经验,对于性能较差的查询,最简单、最有效的优化就是覆盖索引

只有在覆盖索引的情况下,索引的顺序才可能是重要的(并且只有当索引的顺序与查询中指定的顺序相同时)。对于非覆盖指数,指数的顺序可能并不重要


创建不需要的和不需要的索引会给系统增加一些开销(如果您从不插入或更新表,则开销相对较小,但查询优化器仍需查看这些索引),并引入“愚弄”的可能性当有更好的查询优化器可用时,查询优化器的基数指数较低。

此问题可能提供一些见解: