高级MySql
- 启动
mysqlserver mysql start
- 设置root用户密码
/usr/bin/mysqladmin -u root -p root
- 设置开机自启
chkconfig mysql on
- 查看开机启动服务
ntsysv
- 目录结构
- mysql数据库文件的存放路径
/var/lib/mysql/
- 配置文件目录
>/usr/share/mysql
- 项目命令目录
>/usr/bin
- 启停脚本命令
>/etc/init.d/mysql
- mysql数据库文件的存放路径
- 查看字符集
show variables like 'character%';
show variables like '%char%'; - 修改字符集
- [client]
default-character-set-utf8
- [mysqld]
>character_set_server-utf8
>character_set_client-utf8
>collation-servser-utf8_general_ci
- [mysql]
>defalut-character-set=utf8
- [client]
MySql架构
- 连接层;
- 服务层;
- 引擎层;
- 存储层;
引擎区别
性能分析
性能下降,SQL变慢
执行时间长
-
等待时间长
****原因分析****
- 查询语句写的烂
- 索引失败
- 关联查询太多join(设计缺陷或不得已的需求)
- 服务器调优或各个参数设置(缓冲、线程数等)
索引
- 单值索引
为一个字段加索引
create index idx_user_name on user(name); - 复合索引
为多个字段添加索引
create index inde_user_nameEmail on user(name,email);
所有JOIN情况
-
select * from A inner join B on A.key=B.key;
-
select * from A left join B on A.key = B.key;
-
select * from A right join B on A.key = B.key;
-
select * from A left join B on A.key = B.kye where B.key is null;
-
select * from A right join B on A.key = B.key where A.key is null
-
select * from A full outer join B on A.key = B.key
-
select * from A full outer join B on A.key = B.key where A.key is null or B.key is null
索引
- 什么是:
索引(Index)是帮助Mysql高效获取数据的数据结构,可以的的到所以的本质:索引是数据结构。
简单的理解为:排好序的快查找数据结构。(查找 and 排序)
在数据之外,数据库系统还维护这满足特定查找算法的数据结构,这些数据结构以某种方式(指向)数据,这样就可以咋这些数据结构上实现高级查找算法,这种数据结构,就是索引,
一般的索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上
平时说的索引如果没有特殊指明,都是指B树(多路搜索树,并不一定是二叉树) - 优势
提高数据检索效率,降低数据库IO成本高;
降低数据库的排序成本,降低CPU的消耗; - 劣势
实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引也是占用空间的
虽然索引大大提高了查询速度,同时却会降低更新表的速度,因为更新表时,MySql不仅要保存数据,还要保存一下索引文件,
索引只是提高效率的一个因素,如果你的MySql有大数据量的表,就需要花时间研究建立最游侠的索引,或优化查询语句; - 分类
- 单值索引
一个索引只包含单个列,一个表可以有多个单列索引;
- 唯一索引
>索引列的值必须是唯一的,但允许有空值
- 复合索引
>一个索引包含多个列
- 基本语法
- 创建
>create [unique] index indexName on mytable(colummanme)
>alter mytable add [unique] index [indexName] on(colummanme)
- 删除
>drop index[indexName] on mytable
- 查看
>show index from table_name;
- alter 命令
- 单值索引
- mysql索引结构
- BTree索引
- Hash索引
- full-text全文索引
- R-Tree索引
- 那些情况创建索引
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引;
- 查询中与其他表关联的字段,外键关系建立索引
- 频繁更新的字段不适合创建索引
- where条件中用不到的字段不适合创建索引
- 单键/组合索引的选择问题,who?(在高并发下倾向于创建组合索引)
- 查询中排序的字段,排序字段若通过索引去访问,将大大提升排序速度;
- 查询中统计或分组字段
- 那些情况不要创建索引
- 表记录太少;
- 经常增删改的
- 数据重复且分布俊宇的表字段,包含许多重复的内容,建立索引没有太大意义;
性能分析
- MySql Query Optimizer(mysql内部调优)
- mysql常见瓶颈
- CPU: CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候。
- IO:磁盘I/O瓶颈发生在装入数据远大于内存容量的时候;
- 服务器的硬件性能瓶颈:top.free,iostat, vmstat来查看系统性能状态;
- Explain
- 是什么(查看执行计划)
使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySql是如何处理你的Sql语句的。分析你的查询语句或是表结构的性能瓶颈
- 能干吗
- 表的读取顺序
- 数据读取操作的操作类型
- 那些索引可以用
- 呢些索引被实际使用
- 表之间的引用
- 每张表有多少行被优化器查询
- 这么玩
- Explain + SQL语句
- 执行计划包含的信息
- id
1. id 相同,执行顺序,由上到下
2. id 不同,如果是子查询,id的序号会递增,id值越大优先级越高,越优先被执行
3. id 有相同有不同:id如果相同,可以认为是同一组,从上向下顺序执行;在所有组中,id值越大,优先级越高,越优先执行 衍生 = DERIVED
- select_type
1. simple
>简单的select查询,查询中不包含子查询或者UNION
2. primary
>查询中若包含任何复杂的子部分,最外层查询则被标记为
3. subquery
>在select或where列表中包含了子查询
4. derived
>在from列表中包含的子查询被标记为derived(衍生)Mysql会递归执行这些子查询,把结果放在临时表中。
5. union
>若第一个select出现在UNION之后则被标记为union,若union包含在from子句的子查询中,外层select将被宝鸡微:derived
6. union result
>从union表中获取结果的select
>查询的类型,主要用于区别普通查询、联合查询、子查询等复杂查询
- table
- type
- possible_keys
- key
- key_len
- ref
- rows
- Extra
- 个字段解释
- 热盛Case
- 是什么(查看执行计划)