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';