2016-02-29 6 views
0

У меня проблема:cast to unsigned требуется очень долго

Я хочу запросить некоторые данные из 3 больших SQL-таблиц.

eintraege ~ 13000 строк // rubrik2eintrag ~ 9500 строк // rubriken ~ 425 строк

Этот запрос

SELECT eintraege.id AS id, eintraege.email, eintraege.eintrags_name, eintraege.telefon, 
    eintraege.typ, rubrik2eintrag.rubrik AS rubrik, eintraege.status, 
    IFNULL(GROUP_CONCAT(rubriken.bezeichnung), \'- Keine Rubrik zugeordnet\') AS rubrikname 
     FROM eintraege 
     LEFT OUTER JOIN rubrik2eintrag ON rubrik2eintrag.eintrag = eintraege.id 
     LEFT OUTER JOIN rubriken ON rubrik = rubriken.rubrik_id 
     GROUP BY id 
     ORDER BY `id` DESC 
     LIMIT 0, 50 

отлично работает для меня (~ 2 секунды времени отклика), но entrys появляются не в правильный порядок. (например, строка с идентификатором 500 вышла прямо перед строкой с идентификатором 3000)

поэтому я передал идентификатор без знака. например:

ORDER BY CAST(`id` AS UNSIGNED) DESC 

Но теперь для запроса требуется около 40 секунд. Есть ли лучший/быстрый способ достичь правильного упорядоченного вывода?

+0

Что вы получаете от 'desc '? – ethrbunny

ответ

1

По-видимому, id не определен как целочисленный (или числовой) тип данных. Это объясняет порядок, когда он упорядочивает строковое значение.

Некоторые возможности:

Ввести новый столбец в таблице с целочисленным типом данных, заполнения/сохранить содержимое этого столбца, добавьте соответствующий индекс с этой колонки в качестве ведущего индекса, и изменить запрос к заказу новый столбец. (Это было бы лучшим приближением MySQL для индекса, основанного на функциях.)

Или сохраните строковое значение с ведущими нулями, поэтому они имеют одинаковую длину.

000000000500 
000000030000 

Или переопределить id столбец, чтобы быть целочисленный тип.

Помимо этих идей ... нет, нет никакой возможности обойти операцию Using filesort, чтобы упорядочить строки целым значением.

+0

redefine id решил проблему – osanger

Смежные вопросы