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

MRy*_*yui 3 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",或者数据库如何处理这个?

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

bot*_*403 5

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

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