我遇到以下问题:
我想查询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秒响应时间),但是出现的顺序不正确。 (例如,id为500的行就在ID为3000的行之前)
所以我将id转换为unsigned。像这样:
ORDER BY CAST(`id` AS UNSIGNED) DESC
但现在查询需要将近40秒。 是否有更好/更快的方法来达到正确的有序输出?
答案 0 :(得分:1)
显然,id
未定义为整数(或数字)数据类型。这可以解释排序,它按字符串值排序。
一些可能性:
使用整数数据类型在表中引入新列,填充/维护该列的内容,使用该列添加适当的索引作为前导索引,并将查询更改为按新列排序。 (这将是基于函数的索引的最佳MySQL近似。)
或者,将字符串值存储为前导零,因此它们的长度相同。
000000000500
000000030000
或者,将id
列重新定义为整数类型。
除了那些想法之外......没有,实际上没有绕过Using filesort
操作来按整数值排序行。