1.final修饰变量时,是指引用变量不能变,引用变量所指向的内容还是可以改变的
mysql有哪几种锁
- 表级锁:开销小,加锁快,不容易出现死锁,锁细粒度大,发生锁冲突几率大,并发度最低
- 行级锁:开销大,加锁慢,容易出现死锁,锁细粒度小,发生锁冲突几率小,并发度最高
- 页面锁,介于表级锁和行级锁之间
有几种类型的表格
- myisam:
1)不支持事务,查询是原子性,支持表级锁,存储表的总行数,
2)一个myisam类型共有三个文件:索引文件(.myi)、表结构文件(.frm)、数据文件(.myd)
3)采用非聚集索引,索引文件的数据存储指向数据文件的指针 - innodb
1)支持acid的事务,支持四种隔离级别
2)支持行级锁及外键约束,因此可以支持写并发
3)不存储总行数
4)主键索引采用聚集索引(索引的数据域存储),最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整
5)有两个文件:表结构文件,索引和数据在同一个文件中.frm 表结构文件,.idb数据文件
- merge
- Heap
innodb四种事务隔离级别的名称
- read uncommited :读未提交
- read commited: 脏读,不可重复读
- repeatable read : 可重读
- serializable: 串行事务
从1-4级别由低到高,级别越高效率越低
char和vachar之间的区别
一般定长的数据选用char类型,比如身份证号,手机号,电话等,长度变化很大的可以使用varchar类型
mysiamchk用来做什么?
压缩mysiamchk表,减少磁盘或者内存使用
查看表格定义的索引
show index from tablename
blob和text的区别
blob是一个二进制对象,可容纳可变的数量的数据,text是一个不区分大小写的blob
mysql显示前50行
select * from tablename limit 0,50
表最多可以创建16个索引列
now()和 current_date()
now():显示具体年、月、日期、小时、分钟、秒
current_date: 显示年、月份、日期
sql通用的一些函数
- concat(A,B) 连接两个字符串以单个字符串输出,通常将多个字段整理一个字段输出,为了防止sql注入,,一般都要用 like concat() 组合。
phone LIKE CONCAT(CONCAT('%',#{param}),'%'))
MySQL 支持事务吗
- 在缺省模式下,MySQL 是 autocommit 模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,MySQL 是不支持事务的。
- 但是如果你的 MySQL 表类型是使用 InnoDB Tables 或 BDB tables 的话,你的MySQL 就可以使用事务处理,使用 SET
AUTOCOMMIT=0 就可以使 MySQL 允许在非 autocommit 模式,在非autocommit 模式下,你必须使用 COMMIT 来提交你的更改,或者用 ROLLBACK来回滚你的更改。
MySQL 里记录货币用什么字段类型好
NUMERIC 和 DECIMAL 类
salary DECIMAL(9,2)
9(precision)代表将被用于存储值的总的小数位数,而 2(scale)代表将被用于存储小数点后的位数。
MySQL 有关权限的表都有哪几个?
- MySQL 服务器通过权限表来控制用户对数据库的访问,权限表存放在 MySQL 数据库里,由 MySQL_install_db 脚本初始化。
- 这些权限表分别 user,db,table_priv,
columns_priv 和 host
MySQL 数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
1、设计良好的数据库结构,允许部分数据冗余,尽量避免 join 查询,提高效率。
2、选择合适的表字段数据类型和存储引擎,适当的添加索引。
3、MySQL 库主从读写分离。
4、添加缓存机制,比如 memcached,apc 等。
5、书写高效率的 SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1,field_2, field_3 FROM TABLE.
锁的优化策略
- 读写分离
- 分段加锁
- 减少锁持有的时间
- 多个线程尽量以相同的顺序去获取资源
- 不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。
索引的底层实现原理和优化
B+树,经过优化的 B+树
主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,因此 InnoDB 建议为大部分表使用默认自增的主键作为主索引。
什么情况下设置了索引但无法使用
1、以“%”开头的 LIKE 语句,模糊匹配
2、OR 语句前后没有同时使用索引
3、数据类型出现隐式转化(如 varchar 不加单引号的话可能会自动转换为 int 型)
数据库中的事务是什么?
事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作
失败,则事务将回滚,该事务所有操作的影响都将取消。
事务特性:
1、原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。
2、一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态
3、隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,
4、持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。或者这样理解:事务就是被绑定在一起作为一个逻辑工作单元的 SQL 语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过 ACID 测试,即原子性,一致性,隔离性和持久性。
为表中得字段选择合适得数据类型
字段类型优先级: 整>date,time>enum,char>varchar>blob,text
SQL 语言包括哪几部分?每部分都有哪些操作关键字?
SQL 语言包括数据定义(DDL):Create Table,Alter Table,Drop Table, Craete/Drop Index 等
数据操纵(DML):Select ,insert,update,delete,
数据控制(DCL):grant,revoke
数据查询(DQL):select
什么是存储过程?用什么来调用?
存储过程是一个预编译的 SQL 语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次 SQL,使用存储过程比单纯 SQL 语句执行要快。可以用一个命令对象来调用存储过程。
如何通俗地理解三个范式?
第一范式:1NF 是对属性的原子性约束,要求属性具有原子性,不可再分解;是最基本的范式。数据库表中的所有字段值都是不可分解的原子值
第二范式:2NF 是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;需要确保数据库表中每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。一张表中出现数据重复就可以将其拆分成两个表
第三范式:3NF 是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。(直接依赖主键)
需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
优点:可以尽量得减少数据冗余,使得更新快,体积小
缺点:对于查询需要多个表进行关联,减少写得效率增加读得效率,更难进行索引
说说对 SQL 语句优化有哪些方法?(选择几条)
1、Where 子句中:where 表之间的连接必须写在其他 Where 条件之前,那些可以过滤掉最大数量记录的条件必须写在 Where 子句的末尾.HAVING 最后。
2、用 EXISTS 替代 IN、用 NOT EXISTS 替代 NOT IN。
SELECT *
FROM class_a
WHERE id IN ( SELECT id FROM class_b);
SELECT *
FROM class_a A
WHERE EXISTS (
SELECT *
FROM class_b B
WHERE A.id = B.id
);
3、 避免在索引列上使用计算
4、避免在索引列上使用 IS NULL 和 IS NOT NULL
5、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
6、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃
使用索引而进行全表扫描
7、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描