1. 使用索引查询的优缺点?

使用索引优点第一:可以保证数据库表中每一行的数据的唯一性,第二:可以大大加快数据的索引速度,在使用分组和排序子句

进行数据检索时,同样可以显著减少查询中分组和排序的时间;

缺点:创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加

2.mysql搜索引擎知道哪些?有什么区别?

我了解到的数据库搜索引擎有MyISAM、InnoDB、BDB、MEMORY等,其中InnoDB和baiBDB提供事务安全表,其他存储引擎都是非事务安全表,

我们项目中常用到的是innoDB,InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全,但是对比Myisam的存储引擎,

InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

1. mysql如何查看索引是否生效?

使用 explain 执行计划查看 在sql前面加入关键字explain 查询出的结果查看type类型检查是否有执行索引

举例:EXPLAIN select * from student;

4.数据库中count()和count(1)有什么区别, 关于count()查询百万数据量速度慢如何优化?

从执行结果来看count(*)和count(1)没有区别,因为他们都不过滤空值

从执行效率来看MySQL会对count(*)做优化

(1)如果列为主键,count(列名)效率优于count(1)

(2)如果列不为主键,count(1)效率优于count(列名)

(3)如果表中存在主键,count(主键列名)效率最优

(4)如果表中只有一列,则count(*)效率最优

5. mysql查询语句的优化?

使用 explain 执行计划执行结果检查

尽量避免在WHERE子句中对字段进行函数或表达式操作,这将导致引擎放弃使用索引而进行全表扫描;

避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOTIN等这样的操作符,因为这会使系统无法使用索引,而只能直接搜索表中的数据

尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引,

例如SELECT * FROM T1 WHERE NAME LIKE ‘%L%’

6. mysql批量插入5000条数据如何优化?

第一种方法:

合并sql插入语句,合并后日志量减少,降低日志刷盘的数据量和频率,从而提高效率,通过合并SQL语句,

同时也能减少SQL语句解析的次数,减少网络传输的IO

比如:INSERT INTO insert_table (uid,content, type) VALUES ('userid_0', 'content_0', 0);

改为:INSERT INTO insert_table (uid,content, type) VALUES ('userid_0', 'content_0', 0), ('userid_1','content_1', 1);

第二种方法:

在同一个事务中进行插入处理

这是因为进行一个INSERT操作时,MySQL内部会建立一个事务,在事务内才进行真正插入处理操作。通过使用同一个事务可以减少创建事务的消耗时间,所有插入都在执行后才统一进行提交操作。

7. mysql查询重复数据?

比如A表有字段id,pid,sname,

查询重复数据:select * from A

where pid in (select pid from A group by pid having count(pid) > 1);

8.mybatis执行原理,或者dao层如何解析sql得到结果集?

mybatis 的执行流程其实就是,

首先第一步加载解析mybatis配置文件(mybatis-config.xml为MyBatis的全局配置文件,)

第二构造会话工厂获取SqlSessionFactory,由会话工厂创建SqlSession对象,对象中包含了执行SQL语句的所有方法

第三执行查询使用Executor执行器,负责SQL语句的生成和查询缓存的维护,得到查询结果集

第四分装结果集返回给dao接口层

9. mysql存储过程和视图?

存储过程:存储程序是被存储在服务器中的组合SQL语句,经编译创建并保存在数据库中,用户可通过存储过程的名字调用执行。存储过程核心思想就是数据库SQL语言层面的封装与重用性。使用存储过程可以较少应用系统的业务复杂性,但是会增加数据库服务器系统的负荷,所以在使用时需要综合业务考虑。

基本语法(了解熟悉一下):

-- 创建存储过程

DROP PROCEDURE IF EXISTS p01_discount; //如果存在先删掉再创建

CREATE PROCEDURE p01_discount(IN consumeNUMERIC(5,2),OUT payfee NUMERIC(5,2)) //声明存储过程,in输入参数 out输出参数

BEGIN

​ --判断收费方式

​ IF(consume>100.00AND consume<=300.00) THEN

​ SETpayfee=consume*0.8;

​ ELSEIF(consume>300.00) THEN

​ SETpayfee=consume*0.6;

​ ELSE

​ SETpayfee = consume;

​ ENDIF;

​ SELECTpayfee AS result;

END ;

-- 调用存储过程

CALL p01_discount(100.0,@discount); //对应存储过程的名字使用call调用 ,把对应的参数传递进去,输出参数使用@声明,

视图:视图本身是一张虚拟表,不存放任何数据。在使用SQL语句访问视图的时候,获取的数据是MySQL从其它表中生成的,视图和表在同一个命名空间(因为表和视图共享数据库中相同的名称空间,因此,数据库不能包含具有相同名称的表和视图)。视图查询数据相对安全,视图可以隐藏一些数据和结构,只让用户看见权限内的数据,使复杂的查询易于理解和使用。

基本语法:

-- 创建视图

CREATE OR REPLACE VIEW user_order_view AS

SELECT

​ t1.id,t1.user_name,t2.order_no,t2.good_id,

​ t2.good_name,t2.num,t2.total_price

FROM v01_user t1

LEFT JOIN v02_order t2 ON t2.user_id =t1.id;

-- 视图调用

SELECT * FROM user_order_view WHEREuser_name='Cicada';