php面试 - mysql

mysql 数据类型

整数类型

tinyint ,smallint ,mediumint,int,bigint
属性:unsigned
长度:可以为整数类型指定宽度,例如int(11),对大多数应用是没有意义的,他不会限制值得合法范围,只会影响显示字符的个数.宽度不够,用0填充.

实数类型

float double decimal
decimal 可存储比bigint 还大的整数;可以用于存储精确的小数float和double类型, 支持使用标准的浮点数进行类似计算.

字符串类型

varchar char text blob

varchar:

  1. varchar 类型用于存储可变长字符串,他比定长类型更节省空间.
  2. varchar使用1或2个额外字节记录字符串的长度.列长度小于255字节,使用1个字表示,否则使用2个.
  3. varchar 长度,存储内容超出指定长度,就会截断.

char:
1.char是定长的,根据定义的字符串长度分配足够的存储空间
2.char会根据需要采用空格进行填充以方便比较
3.char适合存储很短的字符串,或者所有的值都接近同一长度

对于经常变更的数据,char比varchar更好,varchar更容易产生碎片

枚举

有时可以使用枚举代替常用的字符串类型,把不重复的集合存储成一个预定义的集合

日期和时间类型

尽量使用timestamp,比datetime空间效率高,用整数保存时间戳的格式通常不方便处理
如果存储微秒,可以使用bigint存储

对于非常短的列,char比varchar在存储空间上更有效率.

列属性

auto_increment , default , not null, zerofill

mysql 存储引擎

InnoDb表引擎

  1. 默认事务型引擎
  2. 数据存储在共享表空间,可以通过配置分开
  3. 对主键查询的性能高于其他类型的存储引擎
  4. 从磁盘读取数据时自动在内存中构建hash索引
  5. 插入数据时自动构建插入缓存区
  6. 支持热备份,支持崩溃后的安全恢复
  7. 支持行级锁,支持外键

Myisam表引擎

  1. 支持全文索引,压缩,空间函数
  2. 不支持事务和行级锁,不支持崩溃后数据恢复
  3. 表存储在2个文件,MYD和MYI

其他表引擎

Archive Blankhole CSV Memory

MySQL锁机制

概念

当多个查询同一时刻进行数据修改时,就会产生并发控制的问题

共享锁(S)和排他锁(X),其实就是读锁和写锁

读锁

共享的,不堵塞,多个用户可以同时读一个资源,互不干扰.

写锁

排他的,一个写锁会阻塞其他的写锁和读锁,这样可以只允许一个人进行写入,防止其他用户读取正在写入的资源.

锁粒度

表锁,系统性能开销最小,会锁定整张表.

Mysql事务处理

存储过程

mysql索引

索引的类型

  1. 普通索引: 最基本的索引,没有任何约束限制
  2. 唯一索引: 与普通索引类似,但是具有唯一性约束
  3. 主键索引: 特殊的唯一索引,不允许有空值

一个表只能有一个主键索引,可以有多个唯一索引

主键索引一定是唯一索引,唯一索引不是主键索引

主键可以与外键构成参照完整性约束,防止数据不一致

  1. 外键索引: 只有innodb类型的表才可以使用外键索引,保证数据的完整性,一致性,和实现级联操作.
  2. 全文索引: myisam 只能对英文
  3. 组合(联合)索引: 将多个列组合在一起创建索引,可以覆盖多个列.

索引的创建原则

  1. 最适合索引的列是出现在where子句中的列,或连接子句中的列而不是select关键字后的列
    2.索引列的基数越大,索引效果越好
    3.对字符串进行索引,应该制定一个前缀长度,节省大量索引空间
    4.根据情况创建复合索引,复合索引可以提高查询效率
  2. 避免创建过多索引,索引会额外占用磁盘空间
  3. 主键尽可能选择较短的数据类型

注意

复合索引遵循前缀原则

key(a,b,c)
where a = 1 and b=2 and c=3
where a = 1 and b=2
where a =1
where b=2 and c =3 (索引不生效)
where a=1 and c =3 (索引不生效)

like查询,%不能在前,可以使用全文索引

where name like “%sui%”(不生效,”sui%”生效)

column is null 可以使用索引

其他

  1. 如果or前的条件中列有索引,后面没有,索引都不会生效
  2. 列类型是字符串,查询时一定要给值加引号,否错不生效
纵有疾风起,人生不言弃!