MySql基础知识点

常用的sql语句

条件查询、关联查询、排序查询、分组查询、逻辑关键字、函数

常用的数据类型

整数型和浮点数

类型 大小 用途
TINYINT 1 字节,8位 小整数值
SMALLINT 2 字节,2*8位 大整数值
MEDIUMINT 3 字节,3*8位 大整数值
INT或INTEGER 4 字节,4*8位 大整数值
BIGINT 8 字节,8*8位 极大整数值
FLOAT 4 字节,4*8位 单精度
浮点数值
DOUBLE 8 字节,8*8位 双精度
浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 小数值

日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型 大小
(字节)
格式 用途
DATE 3 YYYY-MM-DD 日期值
TIME 3 HH:MM:SS 时间值或持续时间
YEAR 1 YYYY 年份值
DATETIME 8 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535 字节 变长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换

BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值

BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

MySql存储引擎

MyIASM

  • 优点:支持全文检索(InnoDB在版本5.6之后也支持了),查询效率高
  • 缺点:不支持事务,使用表级锁。
    MyISAM的表锁有读锁和写锁(两个锁都是表级别):表共享读锁和表独占写锁。在对MyISAM表进行读操作时,不会阻塞其他用户对同一张表的读请求,但是会阻塞其他用户对表的写请求;对其进行写操作时会阻塞对同一表读操作和写操作,MyISAM存储引擎的读锁和写锁是互斥的,读写操作是串行的。那么,一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理呢?答案是写进程先获得锁。不仅如此,即使读请求先到锁等待队列,写请求后到,写锁也会插到读锁请求之前!这是因为MySQL认为写请求一般比读请求要重要。这也正是MyISAM表不太适合于有大量更新操作和查询操作应用的原因,因为,大量的更新操作会造成查询操作很难获得读锁,从而可能永远阻塞。这种情况有时可能会变得非常糟糕! 

InnoDB(5.5版本之后的默认引擎)

  • 优点:支持ACID事务,支持外键,支持行级锁提高了并发效率

MySql中的锁

  • 表锁:开销小,加锁快,不会出现死锁,但锁的力度比较大,发生锁冲突的概率高,因此并发访问效率低
  • 行锁:开销大,加锁慢,有可能出现死锁,但锁的力度比较小,发生锁冲突的概率比较低,因此并发访问效率高
  • 共享锁(读锁):如果一个事务已经占有锁,那么其他的事务可以读但不能写,可以使用SELECT ... LOCK IN SHARE MODE 显式加共享锁,如:SELECT * FROM tb_user WHERE user_id=1 LOCK IN SHARE MODE;
  • 排他锁(写锁):如果一个事务已经占有锁,那么其他的事务不能读也不能写,对于update,insert,delete语句innodb会自动给涉及的数据集加上排他锁,可以使用SELECT ... FOR UPDATE 显式加排他锁,如:SELECT * FROM tb_user WHERE user_id=1 FOR SHARE

MySql中的索引

索引可以大幅增加数据库的查询性能。但是使用索引也是有代价的:

  1. 需要额外的磁盘空间保存索引。
  2. 对插入更新删除等操作,由于更新索引会增加额外的开销

因此索引比较适合用在读多写少的场景。

类型

  • 唯一索引:保证索引列中的值是唯一的,允许出现空值
  • 主键索引:是一种特殊的唯一索引,不允许出现空值
  • 普通索引:与唯一索引不同,允许索引列中存在相同的值
  • 联合索引:由多个列共同组成的索引,应用联合索引时要注意最左原则,即:WHERE查询条件中的字段必须与索引字段从左至右依次匹配,如果查询条件中没有用到联合索引的第一个字段,那么联合索引是不会生效的
  • 全文索引:只能在char,verchar,text类型上使用,底层使用倒排索引实现,要注意对于大数据量的表生成全文索引非常消耗时间也非常消耗磁盘空间

实现

  • B-Tree:比较适合用作大于或小于这样的范围查询,是MySql最常使用的一种索引实现
  • R-Tree:用于处理多维数据的数据结构,可以对地理数据进行空间索引,实际业务中使用较少
  • Hash:使用散列表来对数据进行索引,Hash方式不会像B-Tree那样需要查询多次才能定位到记录,因此Hash索引的效率比B-Tree高,但是不支持范围查找、排序等功能,实际使用也较少
  • FullText:全文索引,是一种记录关键字与对应文档关系的一种倒排索引

MySql调优

开发人员主要掌握:

  1. 可以从表结构和索引进行优化
  2. 可以从sql进行优化
  3. 从MySql参数优化(简单了解)

表结构与索引优化原则

  • 在设计表结构时,要考虑到数据库的扩展能力和数据量和读写量的增长,规划好分库分表方案,读写分离方案
  • 为字段选择合适的数据类型,在满足业务逻辑的条件下优先选用占用空间小的数据类型。
  • 将字段多的表分解成多个表,必要时增加中间表进行关联
  • 可以轻量的反范式,适当的增加冗余字段,可以避免关联查询提高查询效率
  • 为查询创建必要索引,创建索引时要谨慎考虑,避免滥用,毕竟索引的使用也是有代价的
  • 列字段尽量设置为NOT NULL 不允许空值,使用了NULL的列很难进行查询优化,允许NULL会使索引,索引统计更加复杂,允许NULL的列需要更多的存储空间,还需要MySql内部进行特殊处理,因此,具体字段建议设置一个状态值代表NULL

sql优化

  • 分析慢查询日志,寻找最需要优化的语句
  • 利用分析工具:explain、profile 查看执行计划
  • 尽量在有索引的字段上进行排序操作
  • 优化sql语句这里

存储过程与函数

  1. 存储过程一般独立的来执行,而函数往往是作为其他SQL语句的一部分来调用
  2. sql语句中不能使用存储过程,但可以使用函数
  3. 存储过程说白了就是把经常使用的SQL语句或业务逻辑封装起来,预编译保存在数据库中,当需要的时候从数据库中直接调用,省去了编译的过程. 提高了运行速度,因此,存储过程会降低程序的可移植性,因此要谨慎使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章