MYSQL
数据类型
tinyint、smailint、mediumint、int、bigint
无符号unsigned
长度可以指定,如int(4),并不会限制int的取值范围,只是影响显示字符的个数。如-0
floatdoubledecimal
decimal可存储比bigint还大的整数,可用于存储精确的小数。
floatdouble支持使用标准的浮点进行近似计算。
varcharchartextblog
varchar存储可变长字符,比char更节省空间(某些环境下),使用1-2个字节来记录字符串的长度,低于使用1个字节。超出指定的长度会被截断。
char定长,适合存储很短的字符串,或者都接近一个长度的,比如hash后的密码,超过指定长度也会被截断。
对于经常变更的数据,使用char不易产生碎片,非常短的列char在空间上效率更高。
避免使用blog/text,查询会使用临时表,性能开销严重。
使用枚举提高性能,ENUM内部存储的是枚举的索引,更小。
时间推荐使用timestamp,比datetime空间效率高。对于微秒可以使用bigint存储,对于小数点可以先扩大10万倍存储,取出时再换算回来。
列属性
auto_increment,default,notnull,zerofill
表引擎
引擎:myisam、innodb、csv、memory
MYISAMINNODB区别
innodb支持事务,表级锁并发更高,共享表空间(数据表存放在同一个文件中,可通过配置分开),支持外键,可以实现热备份,支持崩溃后的安全恢复。
myisam支持全文索引,表数据跟结构存放在不同的文件中MYD和MYI,不支持事务,表及锁。不支持崩溃后的安全恢复。设计简单,数据小并且主要以查询为主时性能很好。
锁
共享锁:读锁,不堵塞,多个用户可以同时读取一个资源,互不干扰
排他锁:写锁,只允许一个用户进行写入
锁粒度:表锁系统性能开销小(myisam)。行锁支持并发高,开销大(innodb)
事务
服务层不管理事务由引擎实现(innodb),在同一个事务中,不推荐使用多种存储引擎
在不支持事务的引擎(myisam)上进行事务操作,不会报错,也不会有效果。
存储过程
保存一条或多条mysql语句的集合,类似编程中的方法。可以对某项业务进行单独的流程管理。
触发器
也是一种存储过程,可通过触发器级联更改表(更改一张表,关联的表也进行更改)。实现检测表中某个字符按的更改而作出处理。
索引
类似书的目录,先去查找索引,避免对大量数据进行全表的查询,进而提高查询速度。帮助服务器避免排序和临时表。将随机I/O变顺序I/O。降低了写的速度,占用了磁盘空间。--空间换时间
使用场景
小表:全表扫描效率更高。
中到大型表:索引十分有效
特大型表:使用索引的代价更大,使用分区来解决。
索引的类型
普通索引:没有约束限制
唯一索引:唯一性约束,不能重复
主键索引:特殊的唯一索引,不允许有空值
组合索引:将多个字段组合在一起创建索引。
外键索引:innodb引擎才有,保证数据的一致性、完整性、和实现级联操作。
全文索引:myisam引擎才有,只能对英文进行全文索引,可以使用第三方的全文索引进行代替,如es
一个表只能由一个主键索引,可以有多个唯一索引。主键索引一定是唯一索引,唯一索引不是主键索引。
主键索引可以与外键构成参照完整性约束,防止数据不一致。
索引创建原则
where子句中的字段,连接子句中的字段
索引列的基数越大,效果越好
对字符串进行索引,制定一个前缀长度,可以节省大量的索引空间
根据情况创建复合索引
避免创建太多索引,会占用磁盘空间,降低写效率
主键选择较短的数据类型,如整形。可减少索引的磁盘占用,提高查询效率
索引注意事项
复合索引遵循前缀原则
key(a,b,c)如果要使用b字段的索引,必须查询a和b,同理,如果要使用c索引,必须查询a和b和c。前缀的索引必须要用到
wherea=1andb=1#okwherea=1andb=1andc=1#okwherea=1#okwhereb=1#nowhereb=1andc=1#no
并不是创建了多个索引,只是一个索引。
like查询,%不能在前,可以使用全文索引
wherenamelike"%wang%"#no
判断字段是否是null可以使用索引
如果mysql估计使用索引比全表扫描慢,会放弃使用索引
如果or前的条件的列有索引,后面的没有,则索引全到不会用到
列类型是字符串,查询时要给值加字符串,否则索引失效
#namevarchar(16)""wherename=#no预览时标签不可点收录于话题#个上一篇下一篇