JD
Новичок
На форуме с: Feb 2005
Cообщений: 36
Город: Kharkov, Ukraine
 |
| |
| | 1. учёл ли ты юникод? а букву "ё" :-) |
|
с юникодом проблем быть не должно. а буква "ё" прохоидт нормально
| |
| 2. для английского быстрее будет ORD(`field`) BETWEEN ... делать
а теперь отправь это в BENCHMARK() и сравни производительность |
|
это ты уже перешел на оптимизацию самих выражений ;-)
я не отрицал наличие других вариантов выражений. бесспорно, ORD() BETWEEEN будет работать быстрее, чем REGEXP.
вот, что у меня получилось:
REGEXP - не особо быстр, зато выглядит красивее и понятнее, чем следующие за ним примеры :-)
BENCHMARK(1000000, ('фыв' REGEXP '^[а-я]'))
1 row in set (0.23 sec)
Вот эти выражения будут выполняться всегда, когда будет попадаться русская буква (а по условию это >90% случаем)
проверки на англ. букву в верхнем и нижнем регистре, и на цифру.
BENCHMARK(1000000, ( (ORD('фыв') BETWEEN 65 AND 90) OR (ORD('фыв') BETWEEN 97 AND 122) OR (ORD('фыв') BETWEEN 48 AND 57) ))
1 row in set (0.24 sec)
или
BENCHMARK(1000000, ( (ORD(UPPER('фыв')) BETWEEN 65 AND 90) OR (ORD('фыв') BETWEEN 48 AND 57) ));
1 row in set (0.25 sec)
Вот такие выражения необходими для распознавания русской буквы
Проверка на руск букву в верхнем регистре (тут не забыта любимая буква zerkmsа ;-) - "ё") (больше ничего не забыл?)
BENCHMARK(1000000, ( (ORD(UPPER('фыв')) BETWEEN 53392 AND 53423) OR (ORD(UPPER('фыв')) = 53377) ) );
1 row in set (0.28 sec)
А если учесть, что, как я понял, BENCHMARK() выполняет все выражения, а в CASE...WHEN... выполняется минимально необходимое количество (т.е. в данном случае, если буква русская, но не Ё, то ORD(UPPER('фыв')) = 53377) выполняться не будет) и буква "ё" встречается очень редко, то для теста выражение можно упростить до:
BENCHMARK(1000000, (ORD(UPPER('фыв')) BETWEEN 53392 AND 53423) );
1 row in set (0.12 sec)
т.е. при установке в первом CASE'е условия на проверку русск.буквы, то на 1000000(!) записей получаем
выигрыш примерно в (0.24 - 0.12) = 0,12 sec с вероятностью >0.9 отсюда, средний выигрыш (0,12 * 0,9) = 0,108 sec 
Это конечно мелочь и её можно списать на погрешность, но все же Поправьте, если я что-то напутал или неправильно понял идею с ORD() BETWEEN
-~{}~ 02.06.08 19:57:
Ещё можно поиграться с вынесением ORD(UPPER('фыв')) "за скобки". тогда просто получим выигрыш в количестве BETWEEN'ов
|