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

标签 mysql sql

我使用的数据库目前是 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/

相关文章:

mysql - SQL 错误文本给我一个与实际值不同的值

sql - 在 SQL 查询中运行 for 循环

php - mysql查询返回表列的错误数据类型

mysql - "ORDER BY ' column_name ' DESC",但是字母前的数字需要两个语句?

SQL - 选择要选择的重复值

sql - "This SqlTransaction has completed; it is no longer usable."...配置错误?

c# - 发送 16 位数字到 SQL 数据库

mysql - 传入用户指定的参数来查询数据库并返回数据

php - 存储过程返回 Mysql Php

php - MySQL 慢检查大表中是否存在行