Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Полезные и вредные индексы MySQL

Полезные и вредные индексы MySQL

Рузин Алексей (КОКОС)

План доклада:

Как следует относиться к индексам
Теория индексов (B-tree)
Оптимизатор запросов MySQL
Рекомендации по созданию индексов
Конкретные примеры

Moscow Python Meetup

February 20, 2014
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Статистика Кокос • База данных - 300GB • 1,5 млрд

    записей • рост ~2,71828 раз в год ;-)
  2. Оптимизатор запросов MySQL • Смотрит сколько записей в таблице •

    Отбирает подходящие индексы • Смотрит на CARDINALITY индексов • Подсчитывает количество чтений блоков • Выбирает алгоритм с минимумом чтений
  3. EXPLAIN QUERY CREATE TABLE emp
 (id INT, name CHAR);
 


    CREATE INDEX ON emp(name); 
 EXPLAIN SELECT * FROM emp
 WHERE name=‘Рузин Алексей’ select_type: SIMPLE
 table: emp
 possible_keys: idx_emp_name, idx_emp_name_salary
 key: idx_emp_name
 rows: 1 (одна)
  4. Индексы вредные • Занимают место • Тратят время на перестроение

    при операциях (insert, update, delete) • «Убаюкивают» разработчиков
  5. Зачем тогда нужен индекс? • Ускорить решение ОДНОЙ задачи поиска

    (иногда нескольких) • Гарантировать уникальность (скрытая задача поиска)
  6. Как определять подходит индекс? • CREATE TABLE emp
 (id INT,

    first_name CHAR, salary INT, city CHAR); • CREATE INDEX ON emp(id) • CREATE INDEX ON emp(first_name) • CREATE INDEX ON emp(city, salary, first_name) • SELECT * FROM emp WHERE first_name=‘Иван’ • SELECT * FROM emp WHERE salary>100 • SELECT * FROM emp WHERE name=‘Иван’ AND salary>100 AND city=‘Москва’
  7. Запросы с поиском по двум и более полям • Используется

    только 1 индекс • Следует строить составной индекс при поиске по нескольким полям • В редких случаях MySQL может использовать пересечение двух одинарных индексов
  8. Рекомендации • Для мелких таблиц-справочников не делать индексы вообще •

    Понять какие запросы к таблице делаются чаще всего • Выбрать самые частые наборы полей • Расставить поля по убыванию CARDINALITY