MySQL, не используя индексы (“Используя filesort”) при использовании ORDER BY

Я поэкспериментировал с вашим кодовым пером и обнаружил, что вам просто нужно добавить position: relative; в ваш класс .custom-btn-#{$color}.

Ваш :before псевдоэлемент уже position: absolute, но в настоящее время он позиционирует себя в столбце вместо самой кнопки.

18
задан knorv 7 April 2009 в 12:36
поделиться

2 ответа

Вы не можете использовать индекс в этом случае, как Вы используете a RANGE фильтрация условия.

Если Вы использовали бы что-то как:

SELECT  *
FROM    values_table this_
WHERE   this_.value1 = @value
ORDER BY
        value2
LIMIT 10

, затем создавая сводный индекс на (VALUE1, VALUE2) использовался бы и для фильтрации и для упорядочивания.

Но Вы используете расположенное условие, вот почему необходимо будет выполнить упорядочивание так или иначе.

Ваш сводный индекс будет похож на это:

value1 value2
-----  ------
1      10
1      20
1      30
1      40
1      50
1      60
2      10
2      20
2      30
3      10
3      20
3      30
3      40

, и если Вы выбираете 1 и 2 в value1, Вы все еще не получаете целый отсортированный набор value2.

Если Ваш индекс на value2 не является очень выборочным (т.е. нет многих DISTINCT value2 в таблице), Вы могли попробовать:

CREATE INDEX ix_table_value2_value1 ON mytable (value2, value1)

/* Note the order, it's important */    

SELECT  *
FROM    (
        SELECT  DISTINCT value2
        FROM    mytable
        ORDER BY
                value2
        ) q,
        mytable m
WHERE   m.value2 >= q.value2
        AND m.value2 <= q.value2
        AND m.value1 BETWEEN 13123123 AND 123123123

Это называют a SKIP SCAN метод доступа. MySQL не поддерживает его непосредственно, но это может быть эмулировано как это.

RANGE доступ будет использоваться в этом случае, но вероятно Вы не получите выигрыша в производительности если DISTINCT value2 включите меньше, чем о 1% из строк.

Отметьте использование:

m.value2 >= q.value2
AND m.value2 <= q.value2

вместо

m.value2 = q.value2

Это делает MySQL выполнить RANGE проверение каждого цикла.

19
ответ дан 30 November 2019 в 09:03
поделиться

Кажется мне, что у Вас есть два полностью независимых ключа, один для value1 и один для value2.

Таким образом, при использовании value1 ключа для получения, записи не обязательно возвращаются в порядке value2, таким образом, они должны быть отсортированы. Это еще лучше, чем полное сканирование таблицы, так как Вы только сортируете записи, которые удовлетворяют Ваш "где value1" пункт.

Я думаю (если бы это возможно в MySQL), составной ключ на (value1, value2) решил бы это.

Попытка:

CREATE TABLE values_table (
    id int(11) NOT NULL auto_increment,
    ...
    value1 int(10) unsigned NOT NULL default '0',
    value2 int(11) NOT NULL default '0',
    PRIMARY KEY  (id),
    KEY value1 (value1),
    KEY value1and2 (value1,value2),
) ENGINE=MyISAM AUTO_INCREMENT=2364641 DEFAULT CHARSET=utf8;

(или эквивалент ALTER TABLE), принятие это - правильный синтаксис в MySQL для составного ключа.

Во всех базах данных я знаю (и я должен признать, что MySQL не является одним из них), который заставил бы механизм DB выбирать value1and2 ключ для получения строк, и они будут уже отсортированы в порядке value2-within-value1, так не нуждался бы в виде файла.

Можно все еще сохранить value2 ключ при необходимости в нем.

0
ответ дан 30 November 2019 в 09:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: