📝 MySQL 基础语法精要

基础

MySQL 是最流行的关系型数据库管理系统之一,掌握基础语法是数据库操作的第一步。

💡 提示: 建议在执行任何修改操作前,先备份数据库,特别是在生产环境中。

数据库和表操作

SQL
-- 创建数据库
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 使用数据库
USE myapp;

-- 创建用户表
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CRUD 操作示例

SQL
-- 插入数据 (Create)
INSERT INTO users (username, email) 
VALUES ('john_doe', 'john@example.com');

-- 查询数据 (Read)
SELECT id, username, email 
FROM users 
WHERE created_at >= '2024-01-01'
ORDER BY created_at DESC
LIMIT 10;

-- 更新数据 (Update)
UPDATE users 
SET email = 'newemail@example.com'
WHERE id = 1;

-- 删除数据 (Delete)
DELETE FROM users 
WHERE id = 1;

索引优化策略

中级

合理的索引设计可以大幅提升查询性能,但过多的索引会影响写入性能。

索引类型 适用场景 特点
PRIMARY KEY 主键字段 唯一且非空,自动创建聚簇索引
UNIQUE 需要唯一性的字段 保证数据唯一性
INDEX 频繁查询的字段 普通索引,可重复
FULLTEXT 文本搜索 全文索引,支持中文
SQL
-- 创建复合索引
CREATE INDEX idx_user_email_status 
ON users (email, status);

-- 查看索引使用情况
EXPLAIN 
SELECT * FROM users 
WHERE email = 'test@example.com';

-- 删除索引
DROP INDEX idx_user_email_status ON users;
⚠️ 注意: 索引不是越多越好。每个索引都会占用磁盘空间,并在增删改时增加开销。建议只为经常用于 WHERE、JOIN、ORDER BY 的字段创建索引。

🚀 查询性能优化

高级

通过优化查询语句和配置,可以显著提升 MySQL 的性能表现。

查询优化技巧

SQL
-- 避免 SELECT *
-- 不推荐:SELECT * FROM users;
SELECT id, username, email FROM users;

-- 使用 LIMIT 限制结果集
SELECT * FROM orders 
WHERE status = 'pending' 
LIMIT 100;

-- 使用 JOIN 替代子查询
-- 不推荐:
-- SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE total > 1000);
SELECT u.* FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE o.total > 1000;

-- 使用索引提示
SELECT * FROM orders USE INDEX (idx_order_date)
WHERE order_date >= '2024-01-01';

配置优化参数

my.cnf
# 内存相关配置
innodb_buffer_pool_size = 1G          # 设置为物理内存的 70-80%
key_buffer_size = 32M                 # MyISAM 索引缓冲区
query_cache_size = 64M                # 查询缓存

# 连接相关配置
max_connections = 200                 # 最大连接数
max_connect_errors = 1000             # 最大连接错误数
wait_timeout = 28800                  # 等待超时时间

# 日志配置
slow_query_log = 1                    # 开启慢查询日志
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2                   # 慢查询阈值(秒)