使用OR时,MYSQL可提高查询性能

迈克尔·塞缪尔

我有一个非常简单的MYSQL表,其中有2列,并运行以下查询:

SELECT * FROM table WHERE (col1 = '123' AND col2 = '456')
                       OR (col1 = '456' AND col2 = '123')

col1和col2是复合主键:PRIMARY KEY('col1','col2')两者都也是另一个表中主键的外键

当我为上述查询运行EXPLAIN命令时,得到以下信息:

id  select_type  table  type    possible_keys   key key_len ref rows    Extra
1   SIMPLE       table  index   PRIMARY,col2    col2    8   NULL    1   Using where; Using index

type上面的结果是index,这是非常相似All,因此很可能是一个大型数据库慢。有没有办法改善上述select命令

史蒂夫

实际上,诸如的声明likely to be slow on a large database应该是一个危险信号。

如果您将要拥有一个大型数据集,则概要分析和测试对于首先确定是否会成为问题,然后确定是否足以解决开发时间和成本至关重要。通常,这意味着微优化不会对大多数代码库产生任何影响。

无论如何,让我们回答问题。

是的,假设使用索引文件是我们的假设,并且如果您有大量数据并查询此表,则有可能通过将查询拆分为多个执行集而不是在查询中使用表达式运算符来进行优化(如果您使用的是只查询两次,如您的示例所示,您可以通过以下方式获得更高的性能union

(
    SELECT * FROM test 
    WHERE
    (
        col1 = 123 AND col2 = 456
    )
)
UNION 
(
    SELECT * FROM test
    WHERE
    (
        col1 = 456 AND col2 = 123
    )
)

EXPLAIN此查询如下:

ID      SELECT_TYPE  TABLE     TYPE POSSIBLE_KEYS   KEY KEY_LEN REF ROWS    EXTRA
1       PRIMARY      test      ref  PRIMARY PRIMARY 4   const   1   Using where; Using index
2       UNION        test      ref  PRIMARY PRIMARY 4   const   2   Using where; Using index
(null)  UNION RESULT <union1,2> ALL (null)  (null)  (null)  (null)  (null)  

看看这个SQL小提琴http://sqlfiddle.com/#!2/9dc07a/1/0,了解一个简单的测试用例。

我在这篇文章中使用的语言,例如“可能”,“可能”等,是因为我没有在此示例中预先加载数亿条记录-我强烈建议您这样做,并评估和分析您的查询更多详情。

不幸的是,通过优化,执行x以获得更好的性能并不总是一个简单明了的答案-查询优化器是一个复杂的野兽,有时试图获得每一个性能下降实际上都会削弱您的应用程序(我是从经验中讲)此处),除非您不必担心这些微观优化,否则,请在决定采用哪种方法之前不要进行评估,概要分析和测试。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用NULL提高MySQL查询的性能?

来自分类Dev

提高MySQL中的查询性能

来自分类Dev

如何提高mysql查询的性能?

来自分类Dev

提高性能的MySQL查询

来自分类Dev

如何提高mysql查询的性能?

来自分类Dev

提高 Mysql 查询性能(索引类型使用说明)

来自分类Dev

MySQL查询性能提高了吗?

来自分类Dev

如何提高复杂的 MySQL 选择查询的性能?

来自分类Dev

MySQL - 需要帮助提高查询性能

来自分类Dev

使用包含来提高linq查询的性能

来自分类Dev

通过使用排序提高sql查询性能?

来自分类Dev

为什么在使用Coherance时在缓存中保留序列化可提高性能?

来自分类Dev

使用LINQ to SQL查询SQL Azure中频繁更改的列时如何提高性能

来自分类Dev

使用StartsWith()时如何提高查找性能

来自分类Dev

提高(查询)性能

来自分类Dev

提高LINQ查询性能?

来自分类Dev

提高SimpleMembership查询性能?

来自分类Dev

无法提高查询性能

来自分类Dev

提高查询性能

来自分类Dev

提高查询性能

来自分类Dev

提高子查询的性能

来自分类Dev

提高 SQL 查询性能

来自分类Dev

提高查询性能

来自分类Dev

提高24小时返回相同结果的SQL查询的性能

来自分类Dev

如何强制联接顺序以提高MYSQL中的查询性能?

来自分类Dev

MySQL-为复杂的计算提高UPDATE查询性能

来自分类Dev

如何在 Python 上提高 MySQL 查询的性能

来自分类Dev

在表变量上使用主键可提高查找性能

来自分类Dev

使用变量时的查询性能