来点$mysql$
开始学mysql
什么是mysql和数据库就不说了,先说说如何在mysql
在linux下,需要使用如下头文件
#include <stdio.h>
#include <mysql/mysql.h>
\(API\)
//连接文件标识符
MYSQL* mysql;
//连接选项
int mysql_options(MYSQL *mysq,enum mysql_option option,const char *arg);
//打开连接
MYSQL *mysql_real_connect(MYSQL *mysql,const char *host,const char *user,const char *password,
const char *dbName,unsigned int port,const char *unix_socket,unsigned long client);
//SQL 语句
int mysql_real_query(MYSQL *mysql,const char *query,unsinged long length);
int mysql_query((MYSQL *mysql,const char *query);
//有返回结果的函数
MYSQL_RES *mysql_use_result(MYSQL *mysql);
MYSQL_RES *mysql_store_res(MYSQL *mysql);
//获得行
MYSQL_ROW mysql_fetch_row(MYSQL_RES * res);
//获得列数
unsigned int mysql_field_count(MYSQL *mysql);
unsigned int mysql_num_field(MYSQL_RES *res);
//获得行数
unsigned int mysql_num_rows(MYSQL_RES *res);
//释放
void mysql_affected_rows(MYSQL *mysql);
//errno
unsigned int mysql_errno(MYSQL *mysql);
const char *mysql_errno(MYSQL *mysql);
我们可以通过这一系列API在C++程序中操作mysql,当然我们也可以写入一些SQL语句来对数据库进行增删查改。
这是使用方面的学习,现在我们聊一件事————“一条SQL查询语句是如何执行的”
MYSQL的基本架构
MYSQL主要分为Server层和存储引擎两部分,server层包含大量的服务功能,比如存储过程、触发器、视图等。而存储引擎负责数据的存储和提取,而存储引擎有InnoDB、MyISAM、Memeory等等,默认引擎是InnoDB。
Server 层包括连接器、查询缓存、分析器、优化器、执行器。
连接器
就是作为用户连接mysql的东西,这里面有一个特殊的东西:长连接。长连接指的是客户端有持续的请求,一直使用一个连接,这和http中的长连接有异曲同工之妙,连接的过程也是有花费的,所以使用长连接是有必要的。
当然长连接也不是无敌的,长期的连接会不断地申请资源,这样内存的占用就会过大。所以我们需要每隔一段时间就进行一次重新连接,或者在MYSQL5.7后使用mysql_reset_connection来重新初始化连接资源。
查询缓存
使用select语句来进行查询,显然如果我们做过这件事情,那我们就直接拿之前的缓存结果就好了,这个就是查询缓存。当然,如果缓存命中那么效率就非常高,但是有一些应用环境更新频繁,这样查询缓存就是白费功夫。可以将参数 query_cache_type 设置成 DEMAND,这样对于默认的 SQL 语句都不使用查询缓存。
分析器
现在不做查询缓存了,对于一条SQL我们需要知道它是否合法以及它的语义,这是一个词法分析和语法分析的过程,具体实现过程就是编译原理的内容。
优化器
现在我们知道要做什么了,但MYSQL还会对我们的语句放在优化器里来做一些优化。
因为一条语句它可以有不同的执行方案,比如多表查询中就会有这样的现象,而优化器就是选择最佳方案的一个过程。
执行器
现在终于开始干活了,首先我们需要验证权限,有权限的话就使用对应存储引擎来执行这个过程。
存储引擎
对于MySQL来说,它提供了很多种类型的存储引擎,我们可以根据对数据处理的需求,选择不同的存储引擎,从而最大限度的利用MySQL强大的功能。
比较常见的有InnoDB、MyISAM、MEMEORY等。
常见面试会问:InnoDB与MyISAM的区别
InnoDB
是 MySQL 默认的事务型存储引擎,只有在需要它不支持的特性时,才考虑使用其它存储引擎。
实现了四个标准的隔离级别,默认级别是可重复读(REPEATABLE READ)。在可重复读隔离级别下,通过多版本并发控制(MVCC)+ 间隙锁(Next-Key Locking)防止幻影读。
主索引是聚簇索引,在索引中保存了数据,从而避免直接读取磁盘,因此对查询性能有很大的提升。
内部做了很多优化,包括从磁盘读取数据时采用的可预测性读、能够加快读操作并且自动创建的自适应哈希索引、能够加速插入操作的插入缓冲区等。
支持真正的在线热备份。其它存储引擎不支持在线热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取。
MyISAM
设计简单,数据以紧密格式存储。对于只读数据,或者表比较小、可以容忍修复操作,则依然可以使用它。
提供了大量的特性,包括压缩表、空间数据索引等。
不支持事务。
不支持行级锁,只能对整张表加锁,读取时会对需要读到的所有表加共享锁,写入时则对表加排它锁。但在表有读取操作的同时,也可以往表中插入新的记录,这被称为并发插入(CONCURRENT INSERT)。
总结
事务: InnoDB 是事务型的,可以使用 Commit 和 Rollback 语句。
并发: MyISAM 只支持表级锁,而 InnoDB 还支持行级锁。
外键: InnoDB 支持外键。
备份: InnoDB 支持在线热备份。
崩溃恢复: MyISAM 崩溃后发生损坏的概率比 InnoDB 高很多,而且恢复的速度也更慢。
其它特性: MyISAM 支持压缩表和空间数据索引。