Sql 查找数据库中某个字段与另一个字段不同的所有行

Sql 查找数据库中某个字段与另一个字段不同的所有行,sql,mysql,Sql,Mysql,我有以下SQL查询: SELECT * FROM table WHERE field_1 <> field_2 从字段1字段2所在的表中选择* 要保持查询效率,最好使用哪种索引结构:字段_1和字段_2上的两个索引,还是包含两个字段的单个索引 编辑:数据库是MySQL我想这可能取决于您使用的平台,但在MS SQL Server上肯定只有一个索引 这取决于您的数据库引擎,但通常最好假设查询每个表只使用一个索引。这意味着跨两列的单个索引可能是最好的 但是,找到答案的唯一方法是使用虚拟数

我有以下SQL查询:

SELECT * FROM table WHERE field_1 <> field_2
从字段1字段2所在的表中选择*
要保持查询效率,最好使用哪种索引结构:字段_1和字段_2上的两个索引,还是包含两个字段的单个索引


编辑:数据库是MySQL

我想这可能取决于您使用的平台,但在MS SQL Server上肯定只有一个索引

这取决于您的数据库引擎,但通常最好假设查询每个表只使用一个索引。这意味着跨两列的单个索引可能是最好的


但是,找到答案的唯一方法是使用虚拟数据填充表并进行尝试。确保虚拟数据在其分布方式方面具有代表性,例如,如果99%的field2值彼此相同,那么它可能会降低具有索引的值。

当然,我会尝试所有三个选项,但请记住,每次插入/更新都会写入每个索引。(因此,索引这两个字段必须在一定程度上更有利,以补偿对写入性能的负面影响)记住,它不一定是完美的,它只需要足够好,以处理系统吞吐量,而不会产生不可接受的UI性能延迟


我首先要尝试的是字段上具有最明显值的单个索引。。。i、 e.如果字段1中有1000个不同的值,而字段2只有20个,那么将索引放在字段1上。

这是一篇关于索引和不等式匹配的好文章:


可选地,如果数据量很大,可以考虑使用触发器来标记另一列,如果列匹配或不匹配,则标记该列,然后搜索该列。当然,这一切都取决于您的情况。

如果您有一个庞大的表,最好将其反规范化,并将filed1field2的结果存储在单独的列中,并在每次插入/更新相应行时更新它。

索引对您没有帮助


数据库必须进行表扫描,因为它正在比较同一行中的两个字段。

请添加您使用的数据库引擎名称,并用该名称标记问题。忘记指定数据库引擎:mysql这是我想到的一个选项,但我应该使用触发器以原子方式执行比较,并将其存储在单独的字段中(我使用一个PHP框架,因此我无法控制更新查询),如果可能的话,我希望避免数据库中的触发器。如果使用MVC框架,我假设您为您的模型定义了某种插入/更新方法,因此您可以在那里进行计算并将结果添加到数据中