Индексы в MySQL — это специальные структуры данных, которые ускоряют поиск и сортировку записей в таблицах. Они работают аналогично оглавлению в книге, позволяя СУБД быстро находить данные без полного сканирования таблицы.
Primary Index (Первичный ключ)
Secondary Index (Вторичный индекс)
Unique Index (Уникальный индекс)
Composite Index (Составной индекс)
Full-text Index (Полнотекстовый индекс)
Синтаксис создания индексов:
-- При создании таблицы
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_username (username),
UNIQUE INDEX idx_email (email),
INDEX idx_created_at (created_at)
);
-- Добавление индекса к существующей таблице
ALTER TABLE users ADD INDEX idx_username (username);
CREATE INDEX idx_username ON users(username);
-- Составной индекс
ALTER TABLE orders ADD INDEX idx_customer_date (customer_id, order_date);
Для ускорения поиска:
Для оптимизации сортировки:
Для покрывающих индексов (covering index):
EXPLAIN SELECT * FROM users WHERE username = 'john_doe';
Вывод EXPLAIN покажет:
key
)rows
)type
= ref, range, index, all)ANALYZE TABLE users;
OPTIMIZE TABLE users;
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "user:password@/dbname")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// Проверка использования индекса
rows, err := db.Query("EXPLAIN SELECT * FROM users WHERE username = ?", "john_doe")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
var (
id int
selectType string
table string
possibleKeys string
key string
keyLen int
ref string
rowsExamined int
extra string
)
for rows.Next() {
if err := rows.Scan(&id, &selectType, &table, &possibleKeys, &key, &keyLen, &ref, &rowsExamined, &extra); err != nil {
log.Fatal(err)
}
fmt.Printf("Используется индекс: %s, Просмотрено строк: %d\n", key, rowsExamined)
}
}
Индексы — мощный инструмент оптимизации запросов в MySQL. Правильное их использование может ускорить выполнение запросов в сотни раз, но требует понимания их работы и регулярного анализа эффективности. Начинайте с индексации первичных ключей и часто используемых в условиях поиска столбцов, затем оптимизируйте на основе реальной нагрузки.