FROM
ON
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
ORDER BY
LIMIT
//索引
索引是 排好序的快速查找数据结构
索引往往以索引文件的形式存储的磁盘上
优势:提高数据检索的效率,降低IO;降低数据排序的成本,降低cpu的消耗
缺点:索引也是一张表,也要占空间;降低更新表的速度
分类:单值索引、唯一索引、复合索引
普通索引:CREATE INDEX idx_user_name ON user_table(name_column);
唯一索引:CREATE UNIQUE INDEX idx_user_name ON user_table(name_column);
多列索引:CREATE INDEX idx_user_name ON user_table(name_column,phone_column);
查看索引:SHOW INDEX FROM user_table;
索引结构:
BTree索引
Hash索引
full-text全文索引
R-Tree索引
//适合建索引
主键自动建立唯一索引
频繁作为查询条件的字段
查询中与其他表关联的字段
高并发下倾向创建组合索引
查询中的排序字段
查询中的统计或者分组字段
//不适合建索引
表记录太少(300万)
更新频繁的字段
重复频繁的字段
//性能分析
MySQL Query Optimizer(MySQL自动优化器)
MySQL常见瓶颈:CPU、IO、服务器硬件的性能瓶颈(top,free,iostat和vmstat来查看系统的性能状态)
Explain
Show profile
//索引优化
全值匹配
最佳左前缀法则
不在索引列上做任何操作
(范围之后全失效)存储引擎不能使用索引中范围条件右边的列
尽量使用覆盖索引
mysql在使用 != 的时候无法使用索引
is null、is not null 也无法使用索引
like以通配符开头,mysql索引失效
字符串不加单引号索引失效
少用or,索引失效
//查询优化
永远小表驱动大表(exists和in,具体分析)
order by 关键字优化:
尽量使用index方式排序(同升同降,最左原则)
如果不在索引列上,filesort有两种算法,4.1之后默认单路排序(一次读取,在buffer进行排序)
优化策略:增大sort_buffer_size参数的设置、增大max_length_for_sort_data参数的设置
不要用select *,会占用buffer
group by 关键字优化(先排序后分组)
同order by 一样
where高于having,能写在where限定的条件就不要去having限定了