mySQL(和MSSQL),在where子句中使用索引和非索引列

时间:2011-03-02 22:23:11

标签: mysql sql

我使用的数据库目前是mySQL,但后来可能是MSSQL。

我的任务是关于mySQL和msSQL如何处理索引和非索引列。

假设我有一个像这样的简单表:

* table_ID - 自动增加。只是一个ID,索引 * table_user_ID - 每个用户都有一个唯一ID 已编入索引
* table_somOtherID -some data ..
* ....

让我们说我有很多!!此表中的行数,但每个用户添加到此表的行数非常小(10-100)

我希望在此表中找到一些特定的行。来自特定用户(索引列)的一行或多行。

如果我使用以下WHERE子句: ..... WHERE table_user_ID ='someID'和table_someOtherID ='anotherValue'。

数据库是否会首先搜索索引列,然后在这些行中搜索“anotherValue”,或者数据库如何处理这个?

如果我必须索引所有表中的每一列,我想数据库会增加很多。 但是你怎么看?是否足以将那些将行数减少到十几百列的列索引?

3 个答案:

答案 0 :(得分:5)

数据库优化器通常通过查看基于查询使用的所有可能索引,在索引的成本基础上工作。在您的特定情况下,它将看到2列 - 带有索引的table_user_ID和没有索引的someOtherID。如果每个用户ID实际上只有10-100行,那么该索引的成本将非常低并且将被使用。这是因为基数很高,DB只能读取它需要的几行而不会触及其他对其不感兴趣的用户的其他行。但是,如果使用索引的成本非常高(很少有唯一的用户ID)每个用户的许多条目)实际上更有效的是不使用索引并扫描整个表以防止随机搜索操作,因为它根据索引跳过表抓取行。

一旦它选择了索引,那么数据库就会抓取与该索引匹配的行(在您的情况下为10到100)并尝试将它们与您的其他条件匹配,搜索其中someOtherID ='anotherValue'的行

答案 1 :(得分:2)

  

但每个用户添加到此表的行数非常小(10-100)

您只需索引user_id。无论您的查询是什么,它都应该为您提供良好的性能,只要它在过滤器中包含user_id即可。在您确定其他用例之前,它会在您声明

时起作用
  

数据库是否会首先搜索索引列,然后在这些行中搜索“anotherValue”,或者数据库如何处理这个?

是的(以外行人的名义表示接近)。

答案 2 :(得分:0)

关于SQL Server: 索引的排序很重要,具体取决于查询方式和索引的结构。如果您在列上创建索引

-table_user_id
-table_someotherID

索引首先由table_user_id排序。例如:

1-2
1-5
1-6
2-3
2-5
2-6

对于索引上的第一条记录,1表是表用户ID,2表示其他值。 如果您使用table_user_id = blah上的where运行查询,则使用此索引将非常快,因为table_user_id按顺序编制索引。 但是如果你运行一个只在WHERE子句中使用table_someotherID的查询,它甚至可能不使用这个索引,因为它不会在索引中快速搜索匹配值,而是对索引进行粗略扫描(这是效率低于寻求者。

此外,SQL Server具有INCLUDE功能,可将SELECT子句中所需的列与您在WHERE或JOIN列上创建的索引相关联。

所以要回答你的问题,这一切都取决于你如何创建索引以及如何查询它们。你不应该考虑索引每一列,因为当你在表上插入和更新时,索引会占用存储和性能。