检查字符编码
Show variables like ‘%char%’;
查询数据库
Show databases;
数据文件默认路径
/var/bin/mysql
存储引擎(主要)
MyiSAM ,InnoDB
建索引
Create index idx_user_name on user(name)创建之后就会排序
Create index idx_user_nameEmail in user(name,email)
MySQL一共四层
连接层、服务层、引擎层、存储层
索引优化分析:
- 性能下降SQL慢
- 执行时间长
- 等待时间长
查询语句写的烂
索引失效单值和复合
关联查询太多Join(设计缺陷或不得已的需求)
服务器调优及各个参数设置(缓冲,线程数等)
常见通用的Join查询
SQL的执行顺序
Union可以去重(并集)
Select * from 表1 left Join 表2 on 表1.a=表2.a
Union
Select * from 表1 right Join 表2 on 表1.a=表2.a
什么是索引?
索引(index)是帮助MySQL高效获取数据的数据结构,可以得到索引的本质:索引是数据结构---排好序的快速查找数据结构。(B+树)
索引的优势:
- 类似大学图书馆建数目索引,提高数据检索的效率,降低数据库的IO成本
- 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗
索引的劣势:
降低更新表的速度,因为更新表时,MySQL不仅要保存数据,还要保存一下
索引文件每次更新添加了索引列的字段。
索引分类:
单值索引:
唯一索引:索引列的值必须唯一,但允许空值。
复合索引:即一个索引包含多个列。
BTree索引检索原理
适合索引创建:
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引
- 查询中与其他表关联的字段,外键关系建立索引
- Where条件里面用不到的字段不创建索引
- 单键组合索引的选择问题,在高并发下倾向创建组合索引
- 频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录还会更新的索引
- 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
- 查询中统计或者分组字段
不适合索引创建:
- 表记录太少
- 经常增删改的表
- 如果某个数据列包含许多重复的内容,为他建立索引就没有太大的实际效果
性能分析:
MySQL常见瓶颈
Explain分析:
- Id相同,执行顺序由上至下
- 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
- Id相同不同,同时存在
字段解释:
Possible_keys: 显示可能应用在这张表中索引,一个或者多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用
- 范围后索引会失效
删索引
Drop index idx_article_ccv on article
结论:
尽可能减少Join语句中nestedloop的循环总次数:永远用小结果集驱动大的结果集