数据库引擎
InnoDB
mysql中存储数据的地方在安装文件的ibdata1中 ,如果数据过大后会再次生成一个 ibdata_xxxx 文件出来
MyISAM
存储数据是在安装文件的中data文件夹下的以数据库名称命名的文件夹下,frm 文件后缀结尾
InnoDB与MyISAM的区别
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不 支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,
但是不提供事务支持,而 InnoDB提供事务支持已经外部键等高级数据库功能。
数据库做集群搭建,在spring配置文件中搭建两个数据源
配置两个 sessionfacotry 去分别 ref 两个sessionfactory 一个 叫 read,一个叫 write
两个hibernatetemplate引用 read和write,这样实现了基本的读写分离
我们做了集群,两个数据库服务器中的数据是一致的,我们做了两个数据源这样用户使用不同的数据库引擎一个读一个写
数据库索引
建立索引
会在索引字段中每条数据加上一个标示,
数据库表字段建立索引会占用空间,
建立索引建立到select经常查询到的字段上
MySQL索引的优化
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据还要更新索引。
建立索引会占用磁盘空间。一般情 况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立索引,或优化查询语句。
分表分库
1.分表
在以往的开发项目的过程中,如果一张表数据量非常大,已经在操作这表的时候,执行效率已经不符合用户的体验度了,我们就会针对这张表进行分表的操作,分表之后,大大提高了数据库效率
1877516909
switch(qq)
case 100000000>&&>200000000 1-2_qq
case 100000000>&&>200000000 2-3_qq
case 100000000>&&>200000000 3-4_qq
PC_PRODUCT
RI_PRODUCT
session.createQuery("from"+TaELE)
2.分库
分库我们通常会根据我们这个项目的版本或者是时间达到某个点进行分库,比如说,我们在做订单的模块的时候,我们会在每一年的结束的时候来进行分库,
加入用户去查询2015的消费情况的时候。我们回去在2015的这个库里去查找,如果实在今年我们会在2016库里去查找
读写分离
在以往的开发项目的过程中我们威力减轻数据库压力我们会在数据库中进行读写分离的操作
1、首先我们在生成数据源的时候会生成两个数据源,两个数据源的所有字段和主键都一样,唯一不同的两张表的数据库引擎不一样,一张为InnoDB,一张为 MyISAM。
2. 因为引擎为INNODB的数据源的引擎支持事务的处理等高级处理,我们可以让其提供写的功能
3.因为引擎为MyISAM的数据源强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持 ,我们可以让其提供读的功能
※在以往对数据库的操作中,我们通常都是进行单表操作
==============================李增强sql优化================================
--执行顺序
select t.*,t.lookename aa
from looker t
where aa>='a'
order by aa
--语法错误,where 后面的aa不认识,
原因,先执行where,后执行select
from --》where--》group by having --》 select --》 order by
--怎么测试,命一个别名,看他认不认识
--效率问题,我们可以使用sql的执行计划,看出每步的用时
--sql的链接查询
select * from emp a,dept b --交叉查询,结果集就是一个笛卡尔集,左表*右表,另一种写法 a cross join b。交叉查询没有实际使用意义
where a.deptno = b.deptno --内连接查询,这就是使用比较多的,-- a [inner] join b on a.xx=b.xx
--number[(p,[s])] number(20,5) []表示参数可选
--左连接查询 a left join b on -----, select * from emp a,dept b where a.deptno = b.deptno(+),也是左连接查询的一种写法,左连接+写在右边
--左连接也是使用最大一种,其次就是内连接
--全外连接查询 full join,不可以两边都+号,绝对不可以
--空值,滤空
--1、有空值参与的运算结果都为空
--2、空值不等于空值
--3、可以使用 ==null是吗?不是,绝对不是, 首先sql中,就不能使用==,这是java中语法,sql中使用=,和java中的==一样,sql中的赋值用 :=,其次,sql中的判断为空用is [not] null
--4、空值在排序的时候,比数值大的
--5、可以使用nulls last 和nulls first来控制空值的前后
select * from emp t order by comm desc nulls last
--6、我们可以使用nvl函数来滤空 nvl(字段,当字段为空时候的默认值),不为空是原值
--7、可以使用decode函数来滤空(T-sql),非标准sql,只有oracle有
--8、case when then 来滤空,这个是一个标准sql,在mysql中可以执行
select a.*,
case age when 2 then '儿童'
when 3 then '成年'
else '老年'
end 状态
from looker a
--能用>=或者<=的地方就尽量不要使用 ><,能带=的就尽量带上=号,效率高