Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MySQL sorting: NULL to the end & use index? Not possible?

Tags:

mysql

I have a huge table and I want simple sorting.

It could be so easy. I could just create an index and do some really fast sorting thanks to that index.

But my client wants to put NULLs to the end, which is complicates the whole situation.

Instead of simple: SORT BY name ASC I have to do SORT BY name IS NULL ASC, name ASC. That would be ok, but it because of that my index is useless, and the sorting is very slow.

I don't know if there's a way to solve this problem, but if there is one, I desperately ask for help. :'(

like image 202
Vojto Avatar asked Apr 08 '10 13:04

Vojto


1 Answers

UNION ALL is not guaranteed to preserve the record order, but with current implementation the final ORDER BY will amount just to a single pass over already ordered fields:

SELECT  *
FROM    (
        SELECT  1 AS source, *
        FROM    user
        WHERE   name IS NOT NULL
        ORDER BY
                name
        )
UNION ALL
SELECT  2 AS source, *
FROM    user
WHERE   name IS NULL
ORDER BY
        source, name

Omitting the final ORDER BY may break your application in the future.

This is probably one of the rare cases when it's better to split the query in two on the client side.

like image 158
Quassnoi Avatar answered Sep 23 '22 02:09

Quassnoi