一、顺序
SQL语句的顺序不是解析的顺序,实际为
FROM <left_table>
ON <join_condition>
<join_type> JOIN <right_table>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
SELECT
DISTINCT <select_list>
ORDER BY <order_by_condition>
LIMIT <limit_number>
二、语句
- 尽量不使用
SELECT *
- 统计使用
SELECT COUNT(*)
- 尽量不使用内置函数,不对字段进行计算
- 减少
JOIN
,适当字段冗余 - 适当使用
UNION
代替OR
条件查询 WHERE
条件须使用到索引,符合左前缀WHERE
条件为非索引查找一条数据时应使用LIMIT 1
避免找到一条后继续查找AND
除索引外的条件,筛选力度大的优先(优化器会自动优化,但是你应该知道)LIKE
模糊查询注意符合左前缀IN
后数组不宜过大,注意使用EXISTS
代替ORDER BY
适当建立联合索引,注意SELECT
字段不使用索引问题- 注意
OFFSET
过大效率低问题 - 多使用
EXPLAIN
才是关键
三、表
- 表名必须使用单数小写加下划线形式
- 对于布尔型字段命名
is_
,has_
,can_
等,unsigned tinyint
,0否1是 InnoDB
中推荐varchar
代替char
引文 (但是固定表效率更高?)- 小数使用
decimal
存储,double
、float
会精度丢失 text
类型应单独建立表分离出来- 主键索引名
pk_
,唯一索引名uk_
,普通索引名idx_
- 具有唯一性字段必须建立唯一索引
- 字符型索引的建立一般没必要全长度索引
- 字段名不该使用
desc
,range
等保留字 - 字段尽量
not null
- 应该写属性
comment
- 实际应用中不使用外键.
- 一张表只能有一个
AUTO_IN CREMENT
字段且该字段必须为KEY
四、配置
max_connections
最大连接数。1back_log
超过最大连接数存放在堆栈中的等待数wait-timeout
连接闲置最大时间值thread_concurrency
应设为CPU核数的2倍,cup数*核数*2skip-name-resolve
禁用DNS解析key_buffer_size
索引块的缓冲区大小innodb_buffer_pool_size
针对InnoDB的参数sort_buffer_size
排序缓冲区大小set global slow_query_log=1;
开启慢查询日志