1.VARCHAR与CHAR的区别?
VARCHAR长度,如果存储内容超出指定长度,会被截断。
CHAR是定长的,根据定义的字符串长度分配足够的空间。
CHAR会根据需要采用空格进行填充以方便比较
CHAR适合存储很短的字符串,或者所有值都接近同一个长度
CHAR的长度,超出设定的长度,会被截断。
对于经常变更的数据,CHAR比VARCHAR更好,CHAR不容易产生碎片
对于非常短的列,CHAR比VARCHAR在存储空间上更有效率
2.int(0)、char(16)、varchar(16)、datetime、text的意义?
3.数据表引擎:InooDB与MyISAM的区别?整形宽度为0位,定长16,可变长16,时间日期,字符串类型大文本
InooDB:
事务型引擎,性能好
数据存储在共享表空间,可以通过配置打开
对主键查询的性能高于其他类型的存储引擎。
从磁盘读取数据时自动在内存构建hash索引,插入数据时自动构建插入缓冲区
通过一些机制和工具支持真正的热备份
支持崩溃后的安全恢复
支持行级锁
支持外键
MyISAM:
拥有全文索引、压缩、空间函数
不支持事务和行级锁,不支持崩溃后的安全恢复。表锁
表存储在两个文件,MYD和MYI
4.锁机制?
当多个查询同一时刻进行数据修改时,就会产生并发控制的问题。
共享锁和排他锁,其实就读锁和写锁。
读锁:共享的,不堵塞,多个用户可以同时读一个资源,互不干扰。
写锁:排他的,一个写锁会阻塞其他的写锁和读锁,这样可以只允许一个人进行写入,防止其他用户读取正在写入的资源。
锁粒度:表锁,系统性能开销最小,会锁定整张表,MyISAM使用表锁。行锁,最大程度地支持并发处理,但是也带来了最大的锁开销,InnoDB实现行级锁。
5.事务处理
服务器层不管理事务,由下层的引擎实现,所以同一个事务中,使用多种存储引擎不靠谱。
在非事务的表上执行事务操作Mysqlb不会发出提醒,也不会报错。
6.存储过程
为以后的使用而保存的一条或多条mysql语句的集合
存储过程就是有业务逻辑和流程的集合
可以在存储过程中创建表,更新数据,删除等。
使用场景:
通过把处理封装在容易使用的单元中,简化复杂的操作。
保证数据的一致性。
简化对变动的管理
7.触发器
提供给程序员和数据分析员来保证数据完整性的一种方法,他是与表事件相关的特殊的存储过程。
使用场景:
可通过数据库中的相关表实现级联更改。
实时监控某张表中的某个字段的更改而需要做出相应的处理。
某些业务编号的生成等。
滥用会造成数据库及应用程序的维护困难。
8.MySQL创建高性能的索引
真题:简单描述MySQL中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响?
索引基础:
类似于书籍目录,要想找到一本书的某个特定的主题,需要先找到书的目录,定位对应的页码。
存储引擎使用类似的方式进行数据查询,先去索引当中找到对应的值,然后根据匹配的索引找到对应的数据行。
对性能的影响:
大大减少了服务器需要扫描的数据量、帮助服务器避免排序和临时表、将随机I/O变成顺序I/O、大大提高查询速度,降低写的速度、占用磁盘
使用场景:
对于非常小的表,大部分情况下全表扫描效率会更高。
中大型表,索引非常有效。
特大型的表,建立和使用索引的代价将随之增长,可以使用分区技术来解决。
索引类型 :
普通索引:没有约束限制
唯一索引:唯一性约束
主键索引:
组合索引:将多个列组合在一起创建索引,可以覆盖多个列
外键索引:只有InnoDB类型的表才可以使用外键索引,保证数据的一致性、完整性和实现级联操作。
全文索引:MySQL自带的全文索引只能用于MyISAM,并且只能对英文进行全文检索。
唯一跟主键的区别:一个表只能有一个主键索引,可以有多个唯一索引。
主键索引一定是唯一索引,唯一索引不是主键索引
主键可以与外键构成参照完整性约束,防止数据不一致。
创建原则:
1.最适合索引的列是出现在WHERE子句中的列,或连接子句中的列而不是出现在SELECT关键字后的列。
2.索引列的基数越大,索引的效果越好。
3.对字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间。
4.根据情况创建复合索引,复合索引可以提高查询效率。
5.避免创建过多索引,索引会额外占用磁盘空间,降低写操作效率。
6.主键尽可能选择较短的数据类型,可以有效减少索引的磁盘占用提高查询效率。
注意事项:
1.复合索引遵循前缀原则
KEY(a,b,c)
WHERE a = 1 and b = 2 and c = 3;
WHERE a = 1 and b = 2;
WHERE a = 1;
都可以生效。得按照顺序才生效。
2.like查询,%不能在前,可以使用全文索引
WHERE name like '%wang%';这样的话索引就会失效
3.column is null可以使用索引
4.如果MySQL估计使用索引比全表扫描更慢,会放弃使用索引
5.如果or前的条件中的列有索引,后面的没有,索引都不会被用到
6.列类型是字符串,查询时一定要给值加引号,否则索引失效