Оптимизация MySQL ORDER BY при сортировке значений NULL и 'last' - возможно ли это? - PullRequest
0 голосов
/ 27 января 2012


Я пытался оптимизировать неудобный ORDER BY в MySQL.Проблема в том, что я хочу, чтобы значения NULL и пустые поля отображались внизу, а не сверху.Я придумал:

ORDER BY isnull(if (isnull(Lastname) OR ascii(Lastname)=0, null, 1)), Lastname ASC,
isnull(if (isnull(Firstname) OR ascii(Firstname)=0, null, 1)), Firstname ASC;

Но это вызывает сортировку файлов, получая доступ ко всем строкам таблицы: (

Путем создания индекса (Фамилия, Имя) I 'm может оптимизировать запрос, чтобы он быстро отбрасывался с помощью простой сортировки:

ORDER BY Lastname ASC, Firstname ASC;

Нет сортировки файлов:)

Похоже, что MySQL не позволяет изменить сортировку по умолчанию для NULL,Опция NULLS LAST отсутствует.Разве я не могу оптимизировать оригинальную сортировку?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 27 января 2012

Как насчет этого обходного пути?

( SELECT * FROM 
    WHERE Lastname IS NOT NULL AND Firstname IS NOT NULL 
    ORDER BY Lastname ASC, Firstname ASC ) 
UNION 
( SELECT * FROM 
    WHERE Lastname IS NULL OR Firstname IS NULL 
    ORDER BY Lastname ASC, Firstname ASC );

Если указанный выше запрос слишком медленный, то для ускорения сортировки необходим новый ссылочный столбец, например hasnull.Столбец будет обновляться при вставке или обновлении.Создайте индекс с hasnull, Lastname, Firstname и используйте его для сортировки.

0 голосов
/ 27 января 2012

Рассматривали ли вы объединение столбцов имени и фамилии, а затем сортировку по комбинации обоих?

mysql> select *, CONCAT_WS(' ', fname, lname) as fullname  from order_by_neg_test order by fullname desc;

+----+-------+-------+---------+--------------+
| id | value | fname | lname   | fullname     |
+----+-------+-------+---------+--------------+
|  4 |    -1 | mike  | purcell | mike purcell |
|  3 |     0 | NULL  | jenkins | jenkins      |
|  5 |    17 | chris | NULL    | chris        |
|  1 |    45 | NULL  | NULL    |              |
|  2 |     1 | NULL  | NULL    |              |
|  6 |    27 |       | NULL    |              |
|  7 |    -1 | NULL  | NULL    |              |
+----+-------+-------+---------+--------------+
7 rows in set (0.00 sec)
...