Использование диаграммы классов uml при проектировании и документировании программного обеспечения

Выбор индексов в MySQL

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

Рассмотрим запрос из примера:

SELECT * FROM users WHERE age = 29

Нам необходимо создать индекс на колонку age:

CREATE INDEX age ON users(age);

После этой операции MySQL начнет использовать индекс age для выполнения подобных запросов. Индекс будет использоваться и для выборок по диапазонам значений этой колонки:

SELECT * FROM users WHERE age < 29

Сортировка

Для запросов такого вида:

SELECT * FROM users ORDER BY register_date

действует такое же правило – создаем индекс на колонку, по которой происходит сортировка:

CREATE INDEX register_date ON users(register_date);

Внутренности хранения индексов

Представим, что наша таблица выглядит так:

id | name   | age
1  | Den    | 29
2  | Alyona | 15
3  | Putin  | 89
4  | Petro  | 12

После создания индекса на колонку age, MySQL сохранит все ее значения в отсортированном виде:

age index
12
15
29
89

Кроме этого, будет сохранена связь между значением в индексе и записью, которой соответствует это значение. Обычно для этого используется первичный ключ:

age index и связь с записями
12: 4
15: 2
29: 1
89: 3

Уникальные индексы

MySQL поддерживает уникальные индексы. Это удобно для колонок, значения в которых должны быть уникальными по всей таблице. Такие индексы улучшают эффективность выборки для уникальных значений. Например:

SELECT * FROM users WHERE email = '';
CREATE UNIQUE INDEX email ON users(email)

Тогда при поиске данных, MySQL остановится после обнаружения первого соответствия. В случае обычного индекса будет обязательно проведена еще одна проверка (следующего значения в индексе).

Пример

Рассмотрим пример того, как переименовать индекс в MySQL. В более старых версиях MySQL вам нужно использовать оператор ALTER TABLE, чтобы сначала удалить старый индекс, а затем воссоздать новый индекс.

Например (MySQL 5.6 и старее):

MySQL

ALTER TABLE contacts
DROP INDEX contacts_idx,
ADD INDEX contacts_new_index (last_name, first_name);

1
2
3

ALTERTABLEcontacts

DROPINDEXcontacts_idx,

ADDINDEXcontacts_new_index(last_name,first_name);

В этом примере мы переименовали индекс с именем contacts_idx в contacts_new_index. Это было сделано путем удаления старого индекса, а затем добавления нового индекса.

Начиная с MySQL 5.7, вы можете использовать оператор ALTER TABLE с предложением RENAME INDEX, чтобы переименовать индекс.

Например (MySQL 5.7 и новее):

MySQL

ALTER TABLE contacts
RENAME INDEX contacts_idx TO contacts_new_index;

1
2

ALTERTABLEcontacts

RENAMEINDEXcontacts_idxTOcontacts_new_index;

Этот примет также переименовал бы индекс contacts_idx в contacts_new_index. Если вы не знаете, какую версию MySQL вы используете, безопаснее использовать первый синтаксис (MySQL 5.6 и старее) для переименования индекса.

MySQL и NULL

Есть в MySQL одна особенность. Каждый отдельный NULL является уникальным значением; именно поэтому сравнение нужно осуществлять не так value = NULL, а так value IS NULL. К тому же, это так же распространяется и для значений в уникальных индексах.

Учитывая эту особенность, следующий INSERT запрос мы можем выполнять сколько угодно раз, и каждый раз в поле extension будет вставлен NULL (он считается уникальным для каждой отдельной записи):

INSERT INTO `phone`
(`country`, `area`, `number`)
VALUES (1, 234, 567890);

Да, это полностью рушит логику нашего уникального индекса.

Решение: убедитесь, что все поля в индексе не могут содержать NULL.

Несмотря на этот нюанс, уникальные индексы могут быть очень полезны, в том числе для сохранения целостности данных!

Когда использовать индексы

Наверное, первое, о чем вы подумали: «О, круто! Нужно создать индексы на все поля и будет счастье». К сожалению, это так не работает. Индексы РЕАЛЬНО ускоряют работу поиска только от определенного числа записей. В среднем должно быть несколько десятков тысяч записей, если не сотен, чтобы почуствовать профит от индекса. И всё сильно будет зависеть конкретно от вашей базы, от количества запросов, от мощности железа. Так что если никаких проблем в работе не наблюдается (а в первую очередь нужно исходить именно из этого!), то и индексы создавать не нужно. Потому что помимо того что они попросту не принесут пользы, так они могут нанести еще и вред, так как:

  • индекс всегда занимает место;
  • при внесении изменений в столбцах, входящих в индекс, происходит перестройка индекса. А это далеко не самая дешевая операция.

Если вы делаете личный блог, в котором 100 записей, индексы вам вряд ли понадобятся (за исключением первичных ключей). Однако когда вы работаете с высоконагруженным проектом, база данных которого содержит миллионы строк, без них вряд ли получится обойтись.

#mysql
#индексы
#оптимизация

@ivashkevich

05.06.2018 в 17:18

6024

+582

Курс MySQL с нуля

55%

Назад

Следующий урок

Пользовательский ЧИСЛОвой формат в EXCEL (через Формат ячеек)

В Excel имеется множество встроенных числовых форматов, но если ни один из них не удовлетворяет пользователя, то можно создать собственный числовой формат. Например, число -5,25 можно отобразить в виде дроби -5 1/4 или как (-)5,25 или 5,25- или, вообще в произвольном формате, например, ++(5)руб.###25коп. Рассмотрены также форматы денежных сумм, процентов и экспоненциального представления.

Для отображения числа можно использовать множество форматов. Согласно российским региональным стандартам ( Кнопка Пуск/ Панель Управления/ Язык и региональные стандарты ) число принято отображать в следующем формате: 123 456 789,00 (разряды разделяются пробелами, дробная часть отделяется запятой). В EXCEL формат отображения числа в ячейке можно придумать самому. Для этого существует соответствующий механизм – пользовательский формат. Каждой ячейке можно установить определенный числовой формат. Например, число 123 456 789,00 имеет формат: # ##0,00;-# ##0,00;0

Пользовательский числовой формат не влияет на вычисления, меняется лишь отображения числа в ячейке. Пользовательский формат можно ввести через диалоговое окно Формат ячеек , вкладка Число , ( все форматы ), нажав CTRL+1 . Сам формат вводите в поле Тип , предварительно все из него удалив.

Рассмотрим для начала упомянутый выше стандартный числовой формат # ##0,00;-# ##0,00;0 В дальнейшем научимся его изменять.

Точки с запятой разделяют части формата: формат для положительных значений; для отрицательных значений; для нуля. Для описания формата используют специальные символы.

  • Символ решетка (#) означает любую цифру.
  • Символ пробела в конструкции # ##0 определяет разряд (пробел показывает, что в разряде 3 цифры). В принципе можно было написать # ###, но нуль нужен для отображения 0, когда целая часть равна нулю и есть только дробная. Без нуля (т.е. # ###) число 0,33 будет отражаться как ,33.
  • Следующие 3 символа ,00 (запятая и 00) определяют, как будет отображаться дробная часть. При вводе 3,333 будут отображаться 3,33; при вводе 3,3 – 3,30. Естественно, на вычисления это не повлияет.

Вторая часть формата – для отображения отрицательных чисел. Т.е. можно настроить разные форматы для отражения положительных и отрицательных чисел. Например, при формате # ##0,00;-###0;0 число 123456,3 будет отображаться как 123 456,30, а число -123456,3 как -123456. Если формата убрать минус, то отрицательные числа будут отображаться БЕЗ МИНУСА.

Третья часть формата – для отображения нуля. В принципе, вместо 0 можно указать любой символ или несколько символов (см. статью Отображение в MS EXCEL вместо 0 другого символа ).

Есть еще и 4 часть – она определяет вывод текста. Т.е. если в ячейку с форматом # ##0,00;-# ##0,00;0;»Вы ввели текст» ввести текстовое значение, то будет отображено Вы ввели текст .

Например, формат 0;

Форматы даты и времени в Excel

Форматы даты и времени Excel — очень специфический случай, и у них есть свои правила. Для получения подробной информации и примеров, пожалуйста, ознакомьтесь со следующими руководствами:

Наконец, вот несколько советов по быстрому применению ваших пользовательских форматов к другим ячейкам и книгам:

  • Пользовательский формат Excel хранится в книге, в которой он создан, и недоступен ни в одной другой книге. Чтобы использовать его постоянно, вы можете сохранить текущий файл как шаблон, а затем использовать его как основу для новой книги.
  • Чтобы применить настраиваемый формат к другим ячейкам одним щелчком мыши, сохраните его как стиль Excel. Для этого просто выберите любую ячейку с подходящим оформлением, перейдите на вкладку «Главная» в группу «Стили» и нажмите «Новый стиль ячейки…». Читайте подробную инструкцию .

Итак, вот как вы можете изменить формат чисел в Excel и создать собственное их представление. 

Благодарю вас за чтение и надеюсь увидеть вас снова!

Курсоры

Такие методы как возвращают массив ключей/значений.

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

Тогда метод вернёт ошибку при попытке получить все записи в массиве.

Что делать?

Курсоры предоставляют возможности для работы в таких ситуациях.

Объект cursor идёт по хранилищу объектов с заданным запросом (query) и возвращает пары ключ/значение по очереди, а не все сразу. Это позволяет экономить память.

Так как хранилище объектов внутренне отсортировано по ключу, курсор проходит по хранилищу в порядке хранения ключей (по возрастанию по умолчанию).

Синтаксис:

  • ключ или диапазон ключей, как для .
  • необязательный аргумент, доступные значения:
    • – по умолчанию, курсор будет проходить от самого маленького ключа к большему.
    • – обратный порядок: от самого большого ключа к меньшему.
    • , – то же самое, но курсор пропускает записи с тем же ключом, что уже был (только для курсоров по индексам, например, для нескольких книг с price=5, будет возвращена только первая).

Основным отличием курсора является то, что генерируется многократно: один раз для каждого результата.

Вот пример того, как использовать курсор:

Основные методы курсора:

  • – продвинуть курсор на позиций, пропустив значения.
  • – продвинуть курсор к следующему значению в диапазоне соответствия (или до позиции сразу после ключа key, если указан).

Независимо от того, есть ли ещё значения, соответствующие курсору или нет – вызывается , затем в мы можем получить курсор, указывающий на следующую запись или равный .

В приведённом выше примере курсор был создан для хранилища объектов.

Но мы также можем создать курсор для индексов. Как мы помним, индексы позволяют искать по полю объекта. Курсоры для индексов работают так же, как для хранилищ объектов – они позволяют экономить память, возвращая одно значение в единицу времени.

Для курсоров по индексам является ключом индекса (например price), нам следует использовать свойство как ключ объекта:

А что делать бюджетному стартапу?

Эмоциональный интеллект, проактивная поддержка, какой-то софт с чат-ботами… Сколько это вообще стоит? Если коротко — дорого.

Хороший саппортер вряд ли будет работать по минимальной ставке. Обычно такие спецы владеют английским и легко могут найти зарубежный проект, который удовлетворит их запросы. В общем, не надейтесь, что они не смогут найти работу и прибегут к вам.

Что же делать стартапу с ограниченным бюджетом?

Для начала — тщательно изучить саппорт-ПО и потребность в нём. Возможно, какие-то функции на старте просто не нужны

Ещё обратите внимание на годовую подписку — она, как правило, выгоднее ежемесячной. А если 90% целевой аудитории сидит в Telegram, то покупать что-то в довесок и вовсе нет смысла

Чат-ботов тоже лучше выбирать внимательно. Не стоит брать навороченных голосовых помощников, которые вдобавок оказывают психологическую помощь. В первые месяцы чат-боты вообще могут не понадобиться. Кроме того, когда на линии тишь да гладь, руководитель может сам решить некоторые вопросы, а заодно поближе узнать клиентов и изучить наиболее проблемные зоны в продукте.

Классные специалисты службы поддержки действительно знают себе цену. Но не все. Изучайте рынок и внимательно просматривайте отклики на ваши вакансии. Некоторым специалистам просто не везёт. Они долго не могут найти работу, но при этом обладают отличными навыками общения и, скорее всего, не будут накручивать ценник. Если нужен английский, то, например, поищите людей в Индии и Филиппинах — наши зарплаты их порадуют.

Понимание информации об индексе

Команда SHOW INDEXES отображает соответствующую информацию об индексах в указанной таблице.

Здесь представлены следующие условия и соответствующая информация:

  1. Таблица: это первый столбец вывода. Он показывает имя таблицы, в которой находится индекс.
  2. Неуникальный: второй столбец показывает, может ли индекс содержать дубликат. Это логическое значение, где 1 указывает, что индекс может содержать дубликаты, и 0 в противном случае.
  3. Key_name: втретьем столбце отображается имя индекса. По соглашению первичный ключ принимает имя индекса PRIMARY.
  4. Seq_in_index: вчетвертом столбце отображается порядковый номер столбца в индексе, начиная со значения 1.
  5. Column_name:пятый столбец — это просто имя столбца.
  6. Сопоставление: шестой столбец — это раздел, в котором показано, как столбец сортируется в индексе. Имеется три значения сортировки: A — порядок по возрастанию, B — по убыванию, а NULL — как несортированный.
  7. Количество элементов :седьмой столбец показывает уникальность значения данных. В индексах он показывает предполагаемое количество уникальных значений в конкретном индексе.
  8. Под_часть: восьмой столбец отображает префикс индекса с NULL, что указывает на то, что индексируется весь столбец.
  9. Упаковано: девятый столбец показывает, как упакованы ключи индекса, при этом NULL указывает, что ключи не упакованы.
  10. Null: десятый столбец указывает, может ли столбец содержать значения NULL. Да, если столбец может содержать нулевые значения, и пустой, если нет.
  11. Index_type: одиннадцатый столбец показывает метод индекса, такой как BTREE, HASH, RTREE и FULLTEXT.
  12. Комментарий: двенадцатый столбец показывает информацию об индексе, не описанном в его столбце.
  13. Index_comment: тринадцатый столбец показывает дополнительную информацию об индексе, заданном с помощью атрибута COMMENT при создании.
  14. Видимый: четырнадцатый столбец — это индекс, видимый оптимизатору запросов, со значениями Да и Нет.
  15. Выражение: пятнадцатый столбец отображается, если в индексе используется выражение, а не значение столбца или префикса столбца.

Чтение данных с диска

На жестком диске нет такого понятия, как файл. Есть понятие блок. Один файл обычно занимает несколько блоков. Каждый блок знает, какой блок идет после него. Файл делится на куски и каждый кусок сохраняется в пустой блок.

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

Когда мы ищем что-то внутри файла, нам понадобится пройтись по всем блокам, в которых он сохранен. Если файл очень большой, то и количество блоков будет значительным. Необходимость перепрыгивать с блока на блок, которые могут находиться в разных местах, сильно замедлит поиск данных.

Использование EXPLAIN для анализа индексов

Инструкция EXPLAIN покажет данные об использовании индексов для конкретного запроса. Например:

mysql> EXPLAIN SELECT * FROM users WHERE email = '';
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | users | ALL  | NULL          | NULL | NULL    | NULL |  336 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

Колонка key показывает используемый индекс. Колонка possible_keys показывает все индексы, которые могут быть использованы для этого запроса. Колонка rows показывает число записей, которые пришлось прочитать базе данных для выполнения этого запроса (в таблице всего 336 записей).

Как видим, в примере не используется ни один индекс. После создания индекса:

mysql> EXPLAIN SELECT * FROM users WHERE email = '';
+----+-------------+-------+-------+---------------+-------+---------+-------+------+-------+
| id | select_type | table | type  | possible_keys | key   | key_len | ref   | rows | Extra |
+----+-------------+-------+-------+---------------+-------+---------+-------+------+-------+
|  1 | SIMPLE      | users | const | email         | email | 386     | const |    1 |       |
+----+-------------+-------+-------+---------------+-------+---------+-------+------+-------+

Прочитана всего одна запись, т.к. был использован индекс.

Проверка длинны составных индексов

Explain также поможет определить правильность использования составного индекса. Проверим запрос из примера (с индексом на колонки age и gender):

mysql> EXPLAIN SELECT * FROM users WHERE age = 29 AND gender = 'male';
+----+-------------+--------+------+---------------+------------+---------+-------------+------+-------------+
| id | select_type | table  | type | possible_keys | key        | key_len | ref         | rows | Extra       |
+----+-------------+--------+------+---------------+------------+---------+-------------+------+-------------+
|  1 | SIMPLE      | users  | ref  | age_gender    | age_gender | 24      | const,const |    1 | Using where |
+----+-------------+--------+------+---------------+------------+---------+-------------+------+-------------+

Значение key_len показывает используемую длину индекса. В нашем случае 24 байта — длинна всего индекса (5 байт age + 19 байт gender).

Если мы выполним изменим точное сравнение на поиск по диапазону, увидим что MySQL использует только часть индекса:

mysql> EXPLAIN SELECT * FROM users WHERE age <= 29 AND gender = 'male';
+----+-------------+--------+------+---------------+------------+---------+------+------+-------------+
| id | select_type | table  | type | possible_keys | key        | key_len | ref  | rows | Extra       |
+----+-------------+--------+------+---------------+------------+---------+------+------+-------------+
|  1 | SIMPLE      | users  | ref  | age_gender    | age_gender | 5       |      |   82 | Using where |
+----+-------------+--------+------+---------------+------------+---------+------+------+-------------+

Это сигнал о том, что созданный индекс не подходит для этого запроса. Если же мы создадим правильный индекс:

mysql> Create index gender_age on users(gender, age);
mysql> EXPLAIN SELECT * FROM users WHERE age < 29 and gender = 'male';
+----+-------------+--------+-------+-----------------------+------------+---------+------+------+-------------+
| id | select_type | table  | type  | possible_keys         | key        | key_len | ref  | rows | Extra       |
+----+-------------+--------+-------+-----------------------+------------+---------+------+------+-------------+
|  1 | SIMPLE      | users  | range | age_gender,gender_age | gender_age | 24      | NULL |   47 | Using where |
+----+-------------+--------+-------+-----------------------+------------+---------+------+------+-------------+

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

Клиент НЕ всегда прав

Увы, но реальность саппорта такова, что клиенты гораздо охотнее пишут негативные отзывы. Поэтому качество саппорта необходимо оценивать не по количеству неотработанных обращений, а по числу негативных отзывов о работе поддержки. Но помните, что эти отзывы не всегда объективны.

О том, что не стоит обожествлять клиента, говорят не только руководители агрессивных бизнесов, но и серьёзные издания вроде того же Forbes. Тем не менее многие стартапы всё ещё свято верят, что клиент всегда прав.

Клиентоориентированность сервиса — это хорошо. Но если иногда не включать критическое мышление, она может навредить компании. Рассмотрим следующий кейс:

Клиент Саппорт
Привет! Хочу сделать рефанд. Здравствуйте! Не могли бы Вы, пожалуйста, разъяснить причины Вашего решения?
Не работает приложение. Уточните, пожалуйста: что именно у вас не работает? Приложение не запускается/вылетает/не работают какие-то конкретные функции?
Очень сильно виснет, когда запускаешь на сервере VPS. Ещё не получается интегрировать ботов — какая-то кривая у вас документация. А на самом ПК всё стабильно работает?
На самом ПК да, но мне нужен запуск на серваке. Извините, но мы не несём ответственность за стабильность работы сторонних серверов или программ, а также их интеграцию. Что касается ботов, то попробуйте посмотреть последний пакет 1.0.7 — там всё детально описано.
Ясно) Клиент, как обычно, не прав. Ладно. По ботам я всё по пакету и делал — ошибку в коде выдаёт. Можете глянуть? Повторюсь: VPS-сервер — это сторонний продукт, к которому мы не имеем никакого отношения. Мы нигде не позиционировали наш софт в связке с VPS-серверами. Я попрошу разработчиков протестировать программу на сервере, но, скорее всего, проблема на стороне самого VPS.Код за клиентов мы не пишем, извините.
Даже за деньги?) Даже за деньги.
Офигенный у вас сервис, конечно))) Софт на серваке тонет в лагах, код проверить не можете, рефанд, как я понимаю, тоже в итоге не сделаете?) К сожалению, да — в возврате денежных средств мы вынуждены отказать в соответствии с пользовательским соглашением, которое вы подписали, оплатив продукт: *ссылка*. Для возврата/компенсации должны быть чёткие основания и доказательства: видеофиксация некорректной работы или хотя бы скриншоты или отчёты ошибок.
А-а, а то, что партнёрка не работает, — это тоже, того, в пользовательском соглашении прописано?) В пользовательском соглашении об этом не написано. Однако в разделе «Партнёрская программа» стоит пометка «Бета». Мы несколько раз делали рассылку о том, что функциональность всё ещё тестируется. Пометка об этом есть и в самом разделе партнёрской программы.

В чём суть: пользователь фактически потребовал вернуть деньги за отсутствие функций, которые компания не предоставляла и не рекламировала. Также он пытался интегрировать ботов через документацию — судя по переписке, клиент должен был программировать их самостоятельно. Партнёрская программа действительно могла работать неисправно, однако разработчики заблаговременно предупредили об этом пользователей и отметили, что функция находится на стадии бета-тестирования. Заметьте, начиналось всё с очень громкого заявления, что «не работает приложение».

Кейс, который я представил выше, крайне адекватный. На практике пользователи иногда и вовсе отказываются от каких-либо разъяснений, обращаются с самыми далёкими от продукта просьбами и даже переходят к нецензурной брани.

Почему нельзя уступать подобным клиентам?

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

К таким ситуациям стоит подходить максимально критически: детально разбирать кейсы и выяснять, кто виноват. Если пользователь поставил низкую оценку, потому что у него с утра не задался день, то поддержка здесь ни при чём.


Some customers be like… Изображение: Кирилл Молоков для Skillbox Media / Public domain

Однако негатив, который вылился на страницы соцсетей всё же стоит отрабатывать — кейс можно передать SMM-специалисту. Если пользователь был прав, то вы покажете, что вам не всё равно. Если нет — пусть другие пользователи это увидят.

Я бы ещё подумал, разрешать ли пользователям оценивать услуги саппорта и как это лучше сделать. Ставить оценки лучше так, чтобы саппортер их не видел — не стоит усложнять и без того стрессовую работу.

SQL CREATE INDEX

Инструкция CREATE INDEX используется для создания индексов в таблицах.

Индексы используются для более быстрого извлечения данных из базы данных, чем в других случаях.
Пользователи не могут видеть индексы, они просто используются для ускорения поиска/запросов.

Примечание: Обновление таблицы с индексами занимает больше времени, чем обновление таблицы без них (поскольку индексы также нуждаются в обновлении).
Поэтому создавайте индексы только для тех столбцов, по которым будет часто выполняться поиск.

Синтаксис CREATE INDEX

Создает индекс в таблице. Допускается дублирование значений:

CREATE INDEX index_name
ON table_name (column1, column2, …);

Синтаксис CREATE UNIQUE INDEX

Создает уникальный индекс для таблицы. Повторяющиеся значения не допускаются:

CREATE UNIQUE INDEX index_name
ON table_name (column1, column2, …);

Примечание: Синтаксис для создания индексов различается в разных базах данных.
Поэтому: проверьте синтаксис для создания индексов в вашей базе данных.

Вызов функции

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

Как только базовая структура функции создана, вы можете выполнить ее, вызвав ее из другой функции или непосредственно из Python prompt (командной оболочки). Ниже приведен пример вызова функции printme():

# Определение функции
def printme( str ):
    """This prints a passed string into this function"""
    print(str)
    return

# Теперь вы можете вызвать функцию printme
printme("I'm first call to user defined function!")
printme("Again second call to the same function")

Результат:

I'm first call to user defined function!
Again second call to the same function

Аргументы функции

Вы можете вызвать функцию, используя следующие типы аргументов:

  • Обязательные аргументы
  • Ключевые аргументы
  • Аргументы по умолчанию
  • Аргументы переменной длины

Пример использования

На примере позвольте нам проиллюстрировать, как мы можем создать индекс для конкретной таблицы для повышения производительности.

Мы будем использовать таблицу фильмов в базе данных сотрудников. Вы можете найти ресурс на странице ресурсов ниже:

https://dev.mysql.com/doc/index-other.html

Во-первых, давайте посмотрим, как MySQL использует закулисный процесс для обработки простого оператора SELECT, в котором пол равен F.

EXPLAIN SELECT emp_no, first_name, last_name FROM employees WHERE gender = 'F';

Учитывая размер таблицы и запрашиваемых данных, сканирование более 200 000 строк не очень эффективно. В этом случае мы можем уменьшить это значение, создав индекс.

Чтобы создать индекс, мы можем:

CREATE INDEX gender on employees(gender);

После создания индекса MySQL просканирует значения.

Overhead

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

Создавайте только необходимые индексы, чтобы не расходовать зря ресурсы сервера. Контролируйте размеры индексов для Ваших таблиц:

mysql> show table status;
+-------------------+--------+---------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name              | Engine | Version | Row_format | Rows   | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment |
+-------------------+--------+---------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
...
| users             | InnoDB |      10 | Compact    |    314 |            208 |       65536 |               0 |        16384 |         0 |            355 | 2014-07-11 01:12:17 | NULL        | NULL       | utf8_general_ci |     NULL |                |         |
+-------------------+--------+---------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
18 rows in set (0.06 sec)
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: