简体   繁体   中英

Difference in performance between two similar sql queries

What is the difference between doing:

SELECT * FROM table WHERE column IS NULL

or -

SELECT * FROM table WHERE column = 0

Is doing IS NULL significantly worse off than equating to a constant?

The use case comes up where I have something like:

SELECT * FROM users WHERE paying IS NULL

(or adding an additional column)

SELECT * FROM users WHERE is_paying = 0

If I understand your question correctly, you are asking about the relative benefits/problems with the two situations:

  • where is_paying = 0
  • where paying is null

Given that both are in the data table, I cannot think of why one would perform better than the other. I do think the first is clearer on what the query is doing, so that is the version I would prefer. But from a performance perspective, they should be the same.

Someone else mentioned -- and I'm sure you are aware -- that NULL and 0 are different beasts. They can also behave differently in the optimization of joins and other elements. But, for simple filtering, I would expect them to have the same performance.

Well, there is one technicaility. The comparison to "0" is probably built into the CPU. The comparison to NULL is probably a bit operation that requires something like a mask, shift, and comparison -- which might take an iota of time longer. However, this performance difference is negligible when compared to the fact that you are reading the data from disk to begin with.

comparing to NULL and zero are two different things. zero is a value ( known value ) while NULL is UNKNOWN . The zero specifically means that the value was set to be zero ; null means that the value was not set, or was set to null.

As far as I know comparing to NULL is as fast as comparing to 0, so you should choose based on:

  1. Simplicity - use the option which makes your code simpler
  2. Minimal size - use the option which makes your table smaller

In this case making the paying column NULL -able will probably be better.

You should also check out these questions:
NULL in MySQL (Performance & Storage)
MySQL: NULL vs “”

You'll get entirely different results using these queries, it's not simply a matter of performance.

Suppose you have a variety of users. Some have non-zero values for the "paying" column, some have 0, and some don't have a value whatsoever. The last case is what "null" more or less represents.

As for performance, do you have an index on the "paying" column? If you only have a few hundred rows in the table, this is probably irrelevant. If you have many thousands of rows, you are basically telling the query to iterate over every row of the table unless you have some indexing in place. This is true regardless of whether you are searching for "paying = 0" or "paying is null".

But again, just to reemphasize, the two queries will give you completely different results.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM