Я копаться, чтобы найти официальную документацию для поддержки того, что Пол Дюбуа (хотя член документации команды MySQL) говорит, что в пятой главе «Оптимизация запросов» своей книги MySQL (Developer's Library):
Сделать индексированные столбцы отдельными в выражениях сравнения. Если вы используете столбец в вызове функции или как часть более сложного термина в арифметическом выражении, MySQL не может использовать индекс, потому что он должен вычислить значение выражения для каждой строки. Иногда это неизбежно, но много раз вы можете переписать запрос, чтобы получить индексированный столбец сам по себе.
Лучшее, что я могу найти раздел на Optimizer Transpositions в руководстве Internals:
Однако MySQL не поддерживает транспозиции, где арифметика существует. Таким образом:
WHERE 5 = -column1
не обрабатывают так же, как:
WHERE column1 = -5
Транспозиций для выражения столбца вида = константа являются идеальными для индекса поиска.
В этом случае можно воспользоваться индексом на approps_precio
переписав критерии фильтрации путем деления через по moneda_valor
:
WHERE approps_precio BETWEEN 2000/moneda_valor AND 6000/moneda_valor
Обратите внимание, что MySQL будет по-прежнему необходимо оценить разделение для каждой записи , поэтому я не уверен, что многое будет спасено.
Вы считаете, что вы храните продукт 'approps_precio * moneda_valor' в своем (n индексированном) столбце? Вы можете использовать [триггеры] (http://dev.mysql.com/doc/en/triggers.html), чтобы гарантировать, что его значение остается совместимым с базовыми столбцами. – eggyal