mysql 高级学习笔记

高级知识讲解:

一、索引知识:

  1. 索引的概念:一种用于快速查找(排序)的数据结构。

  2. mysql innerdb引擎试用Btree树来存储索引值。

  3. 聚簇索引概念:一般都是主键做聚簇索引,它的特点就是表行数据的存储位置顺序和索引存的值的顺序一样。

  注意:1.主键默认会建立聚簇索引 2.sqlserver中好像还可以自行建立聚簇索引,此时主键索引就不会是聚簇索引了。

  4.唯一索引:就是列数据是唯一的,比如身份证号码。主键索引默认也是唯一的数据。

  5.覆盖索引(索引覆盖)的概念:
  覆盖索引不是指某种索引类型,而是说 select 字段刚好和索引建立的字段在个数、顺序一样。如果存在这样的话,那么都会使用到对应的索引。并且取值都是在索引中获得而不需要从数据行中得到。
  ps: explain select appname,appprovider from tb_app
  

从中可以看到 possible_keys是null,但是key实际是使用到了idx_appname_appprovider 这个索引.

6.建立索引的注意点:
  1. 一般都是在where、group by、order by 和 联表查询的字段建立索引。
  2. 非主键索引查找数据的方式是间接通过主键索引的值查找???
  3. 联表查询碰到left、right join 的方式时,一般都是在词表建立索引,比如 A left join B 因为A表行是返回所有行数据,根据小表驱动大表的原则,所以要在B表中建立索引。
  4. 一般都是以建立复合索引(多个列组成的索引)为优先,原因是:1. 复合索引可以节约空间 2.表的索引越多对表更新表的效率越差。3. 可能有时候使用到覆盖索引。

7. 索引失效问题:
  1. where 条件字段的查询顺序必须要和建立索引的字段顺序一样,才能使用到索引。比如 建立的 idx_name_age(建立在name和age的索引),那么where 字段的必须要有name (第一个并必须要有才能用到这个索引查找顺序???
  mysql 实践:name字段在第二个或是第三个位置都是可以使用到索引的,为什么呢 因为mysql优化器自动解析索引的正确使用方式),age 字段如果不存在还是会用到这个索引,单使用到这个索引的部分索引。
  length 字段值会小。(带头大哥不能断,就是说复合索引的第一个字段必须出现)

二、锁
  1.锁的分类:读、写锁两种分类

1.1 表锁
  读表锁语法: lock table 表名 read 。 特点:读锁是一个共享锁,也就是说不同的会话都可以select 表的内容,但是不能更新表的内容,表锁是MyIsim 支持。没有事务级别的说法。
  写表锁语法: lock table 表名 write。 特点:写锁是排它锁,也就是说只要给表设置了写锁,那么会话之间的操作就是排斥的。给表A设置写锁,那么两个会话对A的操作是不能同时进行的(除了select操作)
  解锁语法: unlock tables.

2.锁的粒度:表锁,行锁,MyISAM引擎表锁和InnoDB行锁.

  表级锁:开销小,加锁块;不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低。

    行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发性也最高。

  页面锁:开销和加锁界于表锁和行锁之间,会出现死锁;锁定粒度界与表锁和行锁之间,并发一般。

2.1 行锁
  在操作行锁的时候,首先要设置innodb 引擎的自动提交为0 set autocommite=0,然后手动提交更新操作 commit。

2.2 行锁支持事务.

2.2.1 事务有四种隔离级别:为了有效保证并发读取数据的正确性,提出的事务隔离级别.
  数据库事务的隔离级别有4个,由低到高依次为Read uncommitted(未授权读取、读未提交)、Read committed(授权读取、读提交)、Repeatable read(可重复读取)、Serializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

2.2.2 并发事务引起的几种问题:(表锁是没有事务并发问题出现的,因为每次都是锁住表,不存在脏读或是幻读的情况)
  1、更新丢失
  两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。
  2、脏读
  一个事务读取到了另一个事务未提交的数据操作结果。
  3、不可重复读(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但是却得到了不同的结果。
  包括以下情况:
  (1) 虚读:事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值。
  (2) 幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。

3.查看数据库锁的状态:
  show open tables:查看数据库那些表上锁了。

三、 慢查询日志

  1.常用explain sql 来分析sql的执行情况

  2. show profile(首先要设置数据库的profile为1) 来查看sql的执行周期情况

    show profiles;

    show profile cpu,block io for query 1; 查看执行的query id 等于1 的那条sql执行情况(cpu,block io CPU和I/O 操作的情况)。

3. 开启慢查询日志:

  1.查看慢查询查询是否开启情况: show variables like ‘%slow_query_log%‘;

  2.设置全局的慢查询日志开启: set global slow_query_log=1;

  3. 查看慢查询的设置时间: show variables like ‘%long_time_log%‘; 默认是10s

  4. 设置慢查询的阙值时间: set global long_time_log=3; 设置慢查询的阙值时间为3s

时间: 2024-11-03 04:44:20

mysql 高级学习笔记的相关文章

MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

首先需要回顾一下上一篇文章中的内容:MySQL数据库学习笔记(九)----JDBC的PreparedStatement接口重构增删改查 一.JDBC事务处理: 我们已经知道,事务的概念即:所有的操作要么同时成功,要么同时失败.在MySQL中提供了Commit.Rollback命令进行事务的提交与回滚.实际上在JDBC中也存在事务处理,如果要想进行事务处理的话,则必须按照以下的步骤完成. JDBC中事务处理的步骤: 1.要取消掉JDBC的自动提交:void setAutoCommit(boolea

Mysql Cookbook学习笔记第二章

1,使用python链接mysql + ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # -*- coding: utf-8 -*- # connect.py --连接到MySQL服务器 import sys import MySQLdb try:     conn = MySQLdb.connect(db = "cookbook",                            host = "localhost"

MYSQL数据库学习笔记1

MYSQL数据库学习笔记1 数据库概念 关系数据库 常见数据库软件 SQL SQL的概念 SQL语言分类 数据库操作 创建数据库 查看数据库的定义 删除数据库 修改数据库 创建表 数据类型 约束 修改表 表的增删查改 查询 数据库概念 数据库是一种对大量信息进行管理的一种方法. 数据库系统从结构上看,也是可以分为三层的: 物理层:数据实际如何存储 逻辑层:存储的是什么数据,以及数据间是什么关系 试图层:提供给用户的部分数据 关系数据库 目前关于数据库模型最主流的有两种, 一种叫做关系型数据库,这

MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4085684.html 联系方式:[email protected] [正文] 这一周状态不太好,连续打了几天的点滴,所以博客中断了一个星期,现在继续. 我们在之前的几篇文章中学习了JDBC对数据库的增删改查.其实在实际开发中,一般都是使用第三方工具类,但是只有将之前的基础学习好了,在使用开源工具的

【MySQL】《高性能MySQL》学习笔记,第四章,Schema与数据类型优化

[MySQL]<高性能MySQL>学习笔记,第四章,Schema与数据类型优化 良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计schema. 反范式的设计可以加快某些类型的查询,单同时可能使另一类型的查询变慢,比如添加计数表和汇总表是一种很好的优化查询的方式,但这些表的维护成本可能会很高. 1.选择优化的数据类型 更小的通常更好. ? 应该尽量使用可以正确存储数据的最小类型,更小的数据类型通常更快,因为他们占用更少的磁盘,内存和CPU缓存,并且处理时需要的CPU周

mysql字符集学习笔记分享

接着上一篇继续来一篇关于mysql字符设置等问题学习笔记,这篇就不说什么废话了,直接进入正题,不过还是感谢十八哥的无私分享! 我们首先看看mysql整个数据存储和读取一个流程: 连接器(connection) 特性:链接客户端与服务器 过程: 客户端的字节先发给连接器,   连接器选择一种编码将其转换,临时存储 再次转换成 服务器西药的编码,并正真的存储在服务器上 现在,我们以mysql这个流程说一下,在存入数据和读取数据时的编码转换. 如图 存入数据: 读取数据: A:client:GBK -

MySQL数据库学习笔记&lt;一&gt;

MySQL基本概念以及简单操作 一.MySQL MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件. MySQL是将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性. MySQL所使用的 SQL 语

MySQL数据库学习笔记(八)----JDBC入门及简单增删改查数据库的操作

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4050825.html 联系方式:[email protected] [正文]                                                                                                               

MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引

注:本文转自:http://www.cnblogs.com/smyhvae/p/4042303.html 本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两