1 mysq理数据库有哪些数据类型
1 数值类型
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,分别表示 1 字节、2 字节、3 字节、4 字节、8 字节的整数类型。
2字符串类型
包括 VARCHAR、CHAR、TEXT、BLOB。
注意:VARCHAR(n) 和 CHAR(n) 中的 n 并不代表字节个数,而是代表字符的个数。
一个英文字符是一个字节,一个汉字是三个字节
3 时间和日期类型
常用于表示日期和时间类型为 DATETIME、DATE 和 TIMESTAMP。
尽量使用 TIMESTAMP,空间效率高于 DATETIME。
2 varchar和char的区别
char是定长的,vachar是可变的,但是效率char比较高
char 一个字母一个字节 一个汉字2个字节 varchar 均是两个字节
3 索引
1索引的设计原则:
最左原则
命名尽量短小
在经常使用的列上建立索引(group by order by distinct),查询、排序、分组、联合查询的列 上建立
2 索引的优缺点
优点:
通过唯一索引保证了每行数据的唯一性,
加快了查询速度
加速了表与表之间的连接
缺点:
创建和维护索引消耗时间而且索引占据 了一定的物理空间
每次修改和删除都要维护索引,降低了效率
3 不宜使用索引的情况
数据量比较小的,小表不建议建立索引
修改更新频繁的字段
区别度低的比如性别字段
4 索引失效的情况
like语句,包含了%且放在了前边,在后边可以命中索引
索引列是字符串类型 查询条件条件没有用‘’ 默认为了整型数据导致失效
or语句前后的字段没有同时建立索引
索隐列没有not null约束
对索引列进行了数据运算,使用!= <> in not in
where中索引列使用了计算或者函数
4 事务
1事务的四大特性
原子性 事务是最小的执行单位,不允许分割
一致性 事务是从 一个一致状态到另外一个一致状态的过程,事务执行前后数据保持一致
持久性 对数据库的改变是持久的
隔离性 相互隔离
2 事务的并发问题-脏读、幻读、不可重复读
脏读:事务中读取了另外一个事务未提交的数据
幻读:短时间内多次读取同意数据返回的值不同
3事务的隔离级别
read uncommitted
read committed
repeatable read
serializable
4 事务的传播特性
事务是可以传播的,一个事务中的方法调用到另外一个放大是可以传播到另外一个方法的
required 需要事务(默认的),如果调用方法存在事务则加入,不存在则新建一个事务
surrport是 支持事务,如过调用方法存在事务则加入,不存在则以非事务的方法执行
mandory 需要事务,如果调用方法存在事务则加入,不存在则抛出异常
required_new ,如果调用方法存在事务,则挂起,自己新建一个事务执行
not-supported 不支持事务,如果调用方法存在事务则挂起,
never 不支持事务,如果调用方法存在事务则抛出异常
5 in 和exsits的去呗
in适合内表比外表数据量小的情况下,exisits 适合内表比外表数据量大的情况
6 drop truncate 和delete的区别
从执行速度上讲:drop > truncate >> DELETE。
区别 Delete Truncate Drop
SQL类型 属于DML 属于DDL 属于DDL
支持回滚 支持 不支持 不支持
删除内容 表结构还在,删除表的全部或部分数据 ; 表结构还在,删除表中所有数据 ; 从数据库中删除表的所有数据,包括索引和权限
执行速度 速度慢,需要逐行删除 速度快 速度最快
7 如何判断sql是否使用了索引
explain 加上要测试的sql语句
type反应查询语句的性能,
type 结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般情况下查询至少达到 range 级别,最好能达到 ref 级别,否则就可能出现性能问题。
2) possible_keys: SQL查询时可能用到的索引(也就是表中所有的索引)。
可以看到,没加索引时,possible_keys 的值为 NULL,加了索引后的值为 address,即用到了索引address(索引默认为(column_list)中的第一个列的名字).
3) key 显示SQL实际决定查询结果使用的键(索引)。如果没有使用索引,值为NULL
可以看到,没加索引时,key 的值为 NULL,加了索引后的值为 address,即决定查询结果用到了索引address
4) rows 显示MySQL认为它执行查询时必须检查的行数
可以看到,没加索引时,rows 的值为17,即数据表student中所有数据,说明没加索引时的SQL查询是全表扫描;
加了索引后,rows 的值为6,数据库表中address以“北京市”开头的一共也就6条,SQL在执行查询操作时,一共也检查了6行,不必进行全表扫描查询,可以很容易得出结论:加索引的SQL查询性能远高于不加索引的情况。
8 函数和触发器
java调用函数
9大数据量插入sql的时候
1 批处理,批量提交sql可以减少和数据库的交互次数,java中可以用statement或者preparedstatement 的addbatch方法添加多个语句后一次性通过execteBath()当打提交处理的sql语句
注意:要设置批处理的大小和等待时间
批处理的大小指的是一次性执行多少个插入sql,太小的话和数据库交互频率会很高,太大或者太小都会导致数据库内存占用很高,一般是1000-5000
等待时间指的是批处理质检的操作等待的时间
2 索引,在大量数据插入之前可以先删除索引后在加上
3 使用数据库连接池可以减少数据库连接的建立和关闭提供性能
4 数据库参数调整,增加mysql的缓冲区的大小,配置高性能的磁盘