Добро пожаловать, Гость. Пожалуйста авторизуйтесь здесь.
FGHIGate на GaNJa NeTWoRK ST@Ti0N - Просмотр сообщения в эхоконференции RU.LINUX
Введите FGHI ссылку:


Присутствуют сообщения из эхоконференции RU.LINUX с датами от 24 Jan 02 06:01:34 до 21 May 24 12:37:41, всего сообщений: 8303
Ответить на сообщение К списку сообщений Предыдущее сообщение Следующее сообщение
= Сообщение: 5252 из 8303 ========================================= RU.LINUX =
От   : Vladislav Vetrov                 2:5020/2140.152    17 Oct 18 09:47:14
Кому : Andrew Kant                                         17 Oct 18 09:47:14
Тема : Чем чревато хранить цифры в char-полях mysql?
FGHI : area://RU.LINUX?msgid=2:5020/2140.152@Fidonet.org+5bc6dd67
На   : area://RU.LINUX?msgid=2:469/83.1+5bbed52d
= Кодировка сообщения определена как: CP866 ==================================
Ответ: area://RU.LINUX?msgid=2:5030/1957+5bc6ef73
Ответ: area://RU.LINUX?msgid=2:469/83.1+5bc70ea4
==============================================================================
Hello Andrew!

11 окт 18 07:38, you wrote to me:

VV>> В общем - сабж. Какие аргументы? Почему цифры лучше хранить, как цифры,
VV>> а не как текст? Hевозможно провести индексацию? Потеря
VV>> производительности на преобразование типов? Что ещё?
AK>
AK> Основная проблема - корректность сравнения, и, как следствие, порядок
AK> сортировки. Сравнение идёт символьное, а не цифровое. Опять-же,
AK> неоднозначность представления. '5' как соотносится с '5 ' и с ' 5' ? Как ты
AK> думаешь, будут ли равны эти значения?
AK>
AK> Hу и по мелочи - обычно цифровой формат компактнее, то есть занимает меньше
AK> места при прочих равных, так как на одну десятичную цифру нужно не один
AK> байт, а примерно 4 бита.

Благодарю за ответ. Сортировку цифр, записанных текстом, оказывается можно решить следующим хаком: к тексту добавляем любую цифру, например 0.0, затем сортируем.

Пример:

Создаём таблицу:
create table worker (
id INT AUTO_INCREMENT PRIMARY KEY,
name varchar(20),
dept varchar(10),
salary varchar(10)
);

Hаполняем данными:
insert into worker values(100,'Dima','Sales','5000');
insert into worker values(200,'AndreyEx','IT','5.500');
insert into worker values(300,'Boris','IT','7.0');
insert into worker values(400,'Anna','Marketing','9.5');
insert into worker values(500,'Anton','IT','951');
insert into worker values(600,'Vasya','IT','70');

Смотрим, что получилось:

mysql> select * from worker;

+-----+----------+-----------+--------+
| id  | name     | dept      | salary |
+-----+----------+-----------+--------+
| 100 | Dima     | Sales     | 5000   |
| 200 | AndreyEx | IT        | 5.500  |
| 300 | Boris    | IT        | 7.0    |
| 400 | Anna     | Marketing | 9.5    |
| 500 | Anton    | IT        | 951    |
| 600 | Vasya    | IT        | 70     |
+-----+----------+-----------+--------+

Пробуем сортировать по последнему столбцу salary:

mysql> SELECT name, salary FROM worker ORDER BY salary;

+----------+--------+
| name     | salary |
+----------+--------+
| AndreyEx | 5.500  |
| Dima     | 5000   |
| Boris    | 7.0    |
| Vasya    | 70     |
| Anna     | 9.5    |
| Anton    | 951    |
+----------+--------+

Пробуем сортировать, добавив к текстовому столбцу 0.0:

mysql> SELECT name, salary FROM worker ORDER BY salary+0.0;

+----------+--------+
| name     | salary |
+----------+--------+
| AndreyEx | 5.500  |
| Boris    | 7.0    |
| Anna     | 9.5    |
| Vasya    | 70     |
| Anton    | 951    |
| Dima     | 5000   |
+----------+--------+

Hо индексы в таком столбце (salary) работать не будут, т.к. индекс - это сортировка, плюс механизм быстрого доступа (поиска) нужного значения. В столбце salary сортировка будет в алфавитном порядке и хак с добавлением 0.0 уже не прокатит.

В связи с чем вопрос - на сколько нужны индексы в БД? Слышал, что если идёт выборка в MySQL через условие больше или меньше, то дальше индексы уже не работают. Вот этот момент мне не очень понятен. Почему индексы дальше уже не работают после первой операции сравнения?

Также интересно, на сколько отказ от индексов замедлит работу БД?

Vladislav

... -= - <<< - >>> - =-
--- GoldED+/LNX 1.1.5-b20170303 by ASA
* Origin: Love all, trust a few, do wrong to none (2:5020/2140.152)

К главной странице гейта
Powered by NoSFeRaTU`s FGHIGate
Открытие страницы: 0.060352 секунды