我使用的数据库目前是 mySQL,但以后可能是 MSSQL。
我的问题是关于 mySQL 和 msSQL 如何处理索引列和非索引列。
假设我有一个像这样的简单表格:
*table_ID - 自动增加。只是一个 ID,索引。
*table_user_ID - 每个用户都有一个唯一的 ID 索引
*table_somOtherID - 一些数据..
*....
可以说我有很多!!这个表的行数,但是每个用户添加到这个表的行数很少(10-100)
我想在这个表中找到一个或几个特定的行。来自特定用户的一行或多行(索引列)。
如果我使用以下 WHERE 子句: ..... WHERE table_user_ID= 'someID' AND table_someOtherID='anotherValue'。
数据库会先搜索索引列,然后在这些行内搜索“anotherValue”,还是数据库如何处理?
如果我必须索引所有表中的每一列,我想数据库会增加很多。 但是您怎么看,是否足以为那些将行数减少到 10 或 100 的列编制索引?
最佳答案
数据库优化器通常根据查询查看所有可能使用的索引,以成本为基础对索引进行处理。在您的特定情况下,它将看到 2 列 - 带有索引的 table_user_ID 和没有索引的 someOtherID。如果每个 userID 实际上只有 10-100 行,那么这个索引的成本将非常低,并且会被使用。这是因为基数很高,数据库只能读取它需要的几行,而不会触及它不感兴趣的每个其他用户的其他行。但是,如果使用索引的成本非常高(只有很少的唯一用户 ID以及每个用户的许多条目)实际上,不使用索引并扫描整个表以防止随机查找操作可能会更有效,因为它会根据索引在表中跳跃以获取行。
一旦选择了索引,数据库就会抓取与该索引匹配的行(在您的情况下为 10 到 100),并尝试将它们与您的其他条件相匹配,以搜索 someOtherID='anotherValue' 的行
关于mySQL(和 MSSQL),在 where 子句中同时使用索引列和非索引列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5174278/