1. sql 语句优化
a. 通过慢查询发现有问题的sql
b. explain查询和分析sql的执行计划
c. count()和max()优化
max(col) col字段加索引
count() 可以加个二级索引
d. 子查询优化
改用join语句优化
e. group by 优化
加索引
f. limit 优化
limit 1 提高查询性能
g. 其他优化
避免在sql语句中使用now(),rand()函数,因为不能查询缓存,应该用变量代替
避免select * 应该使用select 具体字段
2. 索引优化
a. 选择合适的列建立索引
经常搜索的字段, where,order by ,group by ,on,join字段,尽量使用索引
索引字段越小越好
离散度大的列放到联合索引前面
select * from payment where staff_id = 2 and customer_id = 236;
针对上面的查询是 index(sftaff_id, customer_id) 好?还是index(customer_id, staff_id)好?
因为customer_id的离散度更大,因此用后面的更合适!!
那么问题来了。怎么判断离散度呢,可以使用 select count(distinct customer_id), count(distinct staff_id) from 表名
谁的值大,说明这一些列的离散度更高!
b. 索引优化 sql的方法
查找重复与冗余的索引
c. 索引维护的方法
3. 数据库结构优化
a. 选择合适的数据类型
不要把数字设置为字符串
尽量使用最小的数据类型
如果可能,声明列为NOT NULL
字符长度变化不大,用varchar
character set 使用lant1,不使用utf-8,因为utf-8占用的空间是latin1的3倍
使用Enum,不使用varchar
ip地址设计为int
b. 范式化优化
c. 反范式优化
d. 垂直拆分
e. 水平拆分
f. 选择正确的储存引擎
4. 系统配置优化
a. 系统配置优化
b. 配置文件优化
--character-set:如果是单一语言使用简单的character set例如latin1。尽量少用Utf-8,utf-8占用空间较多。
--memlock:锁定MySQL只能运行在内存中,避免swapping,但是如果内存不够时有可能出现错误。
--max_allowed_packet:要足够大,以适应比较大的SQL查询,对性能没有太大影响,主要是避免出现packet错误。
--max_connections:server允许的最大连接。太大的话会出现out of memory。
--table_cache:MySQL在同一时间保持打开的table的数量。打开table开销比较大。一般设置为512。
--query_cache_size: 用于缓存查询的内存大小。
--datadir:mysql存放数据的根目录,和安装文件分开在不同的磁盘可以提高一点性能。
5. 服务器硬件优化