MySQL

一、编码方式

1、gbk编码:是国家标准编码方式, 不论英文和中文都是由双字节来表示,中文最高位为 1,通用性比较差。
2、utf8编码:国际编码,是多字节编码(中文24,英文8),可以包括世界上所有国家用
到的字符,通用性较好。

二、MySQL日志

  • 1、错误日志(-log-err):不仅用于存储Mysql运行时所产生的较为严重的警告或错误信息。还记录了:
    • 服务器启动和关闭过程中的信息;
    • 服务器运行过程中的错误信息;
    • 事件调度器运行一个事件产生的信息;

查询错误日志存储路径

image.png

配置错误日志文件

log-error="error.log"
  • 2、查询日志(my.cnf):记录建立的客户端连接和执行的所有语句(包括错误的);
    查询是否启动查询日志及存储路径
    image.png

    配置查询日志
//日志输出类型
log-output=FILE
general-log=1
general_log_file="filename.log"
  • 3、慢查询日志(-log-slow-queries):(配置文件 my.ini)
    查询路径
    image.png

    配置
log-output=NONE
log_slow_queries=0
slow_query_log_file="filename.log"
//用来记录MySQL中响应时间超过阀值(临界值)的语句
long_query_time=10

执行select sleep(3) SQL语句存入慢查询日志的语句。

  • 4、更新日志(-log-update)
  • 5、二进制日志(-log-bin):热备 主从复制
    查询路径
    image.png

三种格式:
Statement 记录每一次修改数据库数据时的sql语句。不用记录修改的内容
Row不记录sql上下文相关信息,仅保存被修改的记录。详细的记录了被修改的信息。
Mixedlevel以上两种的混合。
热备(主从复制):Master服务器将自己的每一次改动信息存入到Binarylog日志中,从服务器Slave用master帐号登录,并读取主服务器内的Binarylog文件,在从服务器上运行该日志,将数据进行更新转移。(包括三个进程:1从服务器发出请求访问Binarylog日志 2住服务器将日志内容传给从服务器 3从服务器运行日志)

三、分析慢查询(explain)

在Mysql的配置文件中配置一个阈值,所有sql语句执行时间超过这个阈值的将被存储到慢查询日志中,在终端通过explain该条sql语句

mysql> explain select * from users where name = 'dd';
+----+-------------+-------+------+---------------+------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key        | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+------------+---------+-------+------+-------------+
|  1 | SIMPLE      | users | ref  | name_index    | name_index | 258     | const |    1 | Using where |
+----+-------------+-------+------+---------------+------------+---------+-------+------+-------------+
1 row in set (0.04 sec)
// 主要关注type、key、rows三个属性
//type代表mysql找到所需行的方式,可以取值为:ALL(全表扫描)、ref(哪些列或常量被用于查找索引列上的值)
// key代表实际使用的索引
// rows代表sql查询读取的行数

具体信息在这里这里

四 、索引

索引精讲
分类:

  • 1.普通索引:index,普通的
  • 2.唯一索引:unique,不允许重复
  • 3.主键索引:primary,唯一且不能为空
  • 4.全文索引:fulltext,用于一篇文章中检索文本信息

创建索引的条件:

  • 1.经常用作where条件或者join子句中常出现的列;
  • 2.索引列值的分布,基数越大索引效果越好;
  • 3.使用短索引,如对字符串进行索引,制定一个前缀长度节省索引空间提升速率;
  • 4.不要过度索引,索引占用额外的磁盘空间,索引过多也会降低写操作性能;
  • 5.查询条件中有or时,只有查询条件都创建索引才能使用索引,有其中一个没有建立索引,则这条sql不会使用索引;
  • 6.最左匹配原则:
    假如有个联合索引 key (col1,col2)。那么以下查询是索引无效的
select * from test where col2 = 3;
select * from test where col1 like '%3';
  • 7.索引列不能是表达式或函数的一部分,否则索引无效;

注意:

  • 1、不同的存储引擎支持不同形式的索引,同一种索引在不同的存储引擎下也会有不同的实现方式;例如MyISAM和InnoDB两种就不支持哈希索引,两者都支持B+Tree索引,但实现方式有所区别;
  • 2、查看索引使用情况
show status like 'Handler_read%';
// Handler_read_key 值越高表示索引使用率越高
// Handler_read_rnd_next 值越高索引使用率越低

为减少IO操作,每一次IO读取数据时都会将其相邻的数据读取到内存的缓冲区,因为局部预读性原理告诉我们,当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到;
B+Tree索引原理:

image.png

将数据分散存储在不同的磁盘块中,叶子节点用于存储数据,非叶子节点用于存储搜索方向;

五、视图:是一张虚拟表,select语句执行的结果集

视图的优点:

  • 1、使用视图,可以定制用户数据,聚焦特定的数据。
    解释:在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话, 采购人员,可以需要一些与其有关的数据,而与他无关的数据,对他没 有任何意义,我们可以根据这一实际情况,专门为采购人员创建一个视 图,以后他在查询数据时,只需select * from view_caigou 就可以啦。
  • 2、使用视图,可以简化数据操作。
    解释:我们在使用查询时,在很多时候我们要使用聚合函数,同时还要
    显示其它字段的信息,可能还会需要关联到其它表,这时写的语句可能
    会很长,如果这个动作频繁发生的话,我们可以创建视图,这以后,我
    们只需要select * from view1就可以啦,这样很方便。
  • 3、使用视图,基表中的数据就有了一定的安全性
    因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以将基表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集合,数据是随着基表的更新而更新。同时,用户对视图,不可以随意的更改和删除,可以保证数据的安全性。
  • 4、可以合并分离的数据,创建分区视图
    随着社会的发展,公司的业务量的不断的扩大,一个大公司,下属都设有很多的分公司,为了管理方便,我们需要统一表的结构,定期查看各公司业务情况,而分别看各个公司的数据很不方便,没有很好的可比性,如果将这些数据合并为一个表格里,就方便多啦,这时我们就可以使用union关键字,将各分公司的数据合并为一个视图。

六.数据一致性(处理高并发)

修改下表中的username,打开两个终端窗口,第一个输入

//手动提交事务 为1时自动提交
set autocommit=0; 
begin work; 
select * from users where id=1 for update;

在另一个窗口输入

update users set username=123 where id=1;

此时第一个窗口正在更新该条数据,并为其家锁,因此第二个窗口无法都数据进行更改,数据库报错;


image.png

第一个窗口提交事务后,其余进程才可以修改数据

update users set username=23 where id=1;commit work;

七.函数、存储过程、存储引擎

信息函数:
显示要查询内容的信息(数据库版本 数据的编码方式等)
自定义函数(UDF):必要条件(参数 返回值)
创建自定义函数:
create function 函数名称(参数列表)
returns 返回值类型
函数体(sql语句)
create function f_name
returns{string|interger|real|decimal}
函数体

  • 存储过程:
    SQL语句和控制语句的预编译集合,以一个名称存储作为一个单元处理。
  • 存储过程的优点:
       1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
      2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
      3.存储过程可以重复使用,可减少数据库开发人员的工作量
      4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权
  • 创建存储过程:
    create procedure sp1(参数)
    select version();
    调用存储过程:
    call sp1[()];
    IN:表示该参数的值必须在调用存储过程时指定,不可以返回
    OUT:表示该参数的值可以被存储过程改变,并且可以返回
    INOUT:表示该参数的值在调用时指定,并且可以被改变和返回
    存储过程与函数的区别:
    函数只能通过return语句返回单个值或者表对象。而存储过程不允许执行return,但是可以通过out参数返回多个值,并且定义时的情况也有不同,存储过程的参数需要判断为输入参数还是输出参数,对应IN和OUT,在参数前面注明。函数定义时使用FUNCTION,存储过程定义使用PROCEDURE。存储过程的效率高于函数的效率。
    距离创建一个存储过程,根据age删除记录,并输出删除内容和删除后的内容
  • 存储过程与自定义函数的区别:
    1、存储过程实现的功能相对复杂,函数针对性较强
    2、存储过程可以返回多个值,函数只能有一个返回值
    3、存储过程一般独立执行,函数可以作为 sql 语句的组成部分来出现
create procedure sp1(in p_age smallint unsigned,out deleteUser smallint unsigned,out userCount smallint unsigned)
begin
delete from users where age=p_age;(删除年龄为p_age的用户名)
select row_count into deleteUser;(将删除的用户存入deleteUser表;row_count函数返回前一个被sql更新,删除,插入的行)
select count(id) from users into userCount;(将删除后的信息存入userCount表)
end
call sp1(20,@a,@b);

begin—end语句中间声明的局部变量之在begin—end之间有效。
set @num:set或者select 后跟的@num叫做用户变量。
存储引擎:
根据每张表经常的不同操作,而选择不同的存储引擎。一种存储数据,查询数据的技术。

  • 1 MyISAM:管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。

  • 2 InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。

  • 3 Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。

  • 4 CSV:存储引擎把数据以逗号分隔的格式存储在文本文件中。

  • 5 Archive:为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。

  • 并发控制:当多个连接对数据进行修改时保证记录的一致性和完整性。

  • 共享锁(读锁):在多个用户同时读取一条数据时,数据不会发生改变。

  • 排他锁(写锁):在任何情况下只能有一个用户进行写操作,此时阻止其他用户进行读操作或者写操作。

八、范式

第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容