1. count(1):指查找表的第一个字段来获取总条数,如果该字段允许为空则会得到错误的结果;
2. 事务四大特性:原子,一致,隔离,持久性;
3. 数据库引擎----MyIsam,InnoDB;
4. 数据库优化:
(1)将相对固定的连接信息写入配置文件中,根据测试和生产等环境的不同,准备不同的参数配置文件;
(2)用preparedstatement以批处理的方式操作数据库--addBatch(),一般每批500-100条语句;通过preparedstatement还可以防止sql注入;
(3)使用连接池c3p0;
(4)建立索引---聚集&非聚集,B-Tree索引,位图索引,全文索引;
(5)sql优化;
(6)合理建表,分库分表;
(7)数据库引擎的选择(针对MySQL):
InnoDB:
1、ACID事务的支持,实现了四种隔离级别
2、提供行级锁和外键约束,不支持全文索引且不保存表的行数
3、锁的粒度更小,写操作且条件加索引不会锁全表,并发性好
应用场景:在应用中执行大量insert和update操作
MyISAM:
1、不支持事务、行级锁和外键 ,insert和update会锁全表,效率较低
2、存储了表的行数,计数很快
应用场景:大量select操作
5. 数据库索引:
•索引概念:
数据列的值进行结构化排序的一个东西,SQL的主流索引结构有B+树以及Hash结构。
聚集索引(主键索引,只有一个):索引的逻辑顺序与 数据行的物理存储顺序相同。
非聚集索引(可以有多个):索引的逻辑顺序与 数据行的物理存储顺序不同。
•常见索引:
•1、普通索引:不附加任何限制条件,其值是否唯一和非空由字段本身的完整性约束条件决定 (INDEX)
•2、唯一索引:索引列的值必须唯一,允许有空值(UNIQUE)
•3、主键索引:一种特殊的唯一索引,一个表只能一个主键,不允许有空值。一般是在建表的时候同时创建主键索引 (PRIMARY KEY )
•4、组合索引:多个字段上创建的索引,前提第一个索引被使用才能有效(INDEX )
•5、全文索引:建立在char、varchar,text类型上的索引,MyIsAM支持(FULLTEXT )
•注意事项:
•1、索引应该建立在经常select的字段上,过多索引占磁盘,经常insert、update和delete的
不适合,因为需要维护索引文件,效率低
•2、索引不应包含含有NULL值的列,最好不要让字段默认为null
1️⃣复合索引中只要有一列含有NULL值,那么这一列对于此符合索引就是无效的。
2️⃣MySQL难以优化引用了可空列的查询,它会使索引、索引统计和值更加复杂。
可空列需要更多的储存空间,还需要在MySQL内部进行特殊处理
•3、索引会无效的情况:
(1)、like模糊查询不以字母开头的,如like‘%han%’
(2)、在列上进行运算,如YEAR(column_name)<2018;
(3)、使用NOT IN 、<>、!=操作
(4)、字符串与数字比较不使用索引; CREATE TABLE `a` (`a` char(10));
EXPLAIN SELECT * FROM `a` WHERE `a`="1" -- 走索引
EXPLAIN SELECT * FROM `a` WHERE `a`=1 -- 不走索引
(5)、join操作中主键和外健数据类型不同
(6)、mysql估计使用全表扫描要比使用索引快的情况
6. sql表和语句优化:
一、语句相关优化:
1、in和 exist区别和应用场景
select * from A where id in(select A_idfrom B);
explain select * from A where exists(select B.A_idfrom B where B.A_id= A.id);
注: in先执行内表后执行外表,外表有索引,适合内表小,外表大的。 exist相反
而且在使用not in的时候会使得索引失效,而not exist不会
2、能用between就不要用in:
如果是连续数值,between在找到第一个匹配值后,则直接从该地址往后搜索,直到最后一个元素为止。
这样就不会对后续值进行索引扫描,因此速度快了。 对于in操作可能会造成全索引进行扫描。
3、使用连接查询代替子查询
子查询笛卡尔积重新组合后的过滤性能消耗高,使用连接查询代替
4、分组查询可以禁止排序:
mysql在使用groupby的时候字段默认会对分组字段重新排序,可以加order by null 禁止排序
二、表相关优化:
1、保证update条件建立值唯一的索引
update时如果where条件字段没有建立唯一索引,mysql会锁住整张表,其他线程会等待,所
以我们在update时需要给where条件建立索引,提高并发能力。
Lock in share mode(共享锁), for update(排它锁)
2、尽量使用数字型字段.
字符型会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接会逐个比较字符串
中每一个字符,而对于数字型而言只需要比较一次就够了。
3、固定长度的表会更快
固定的长度是很容易计算下一个数据的偏移量,读取快,如果字段不是定长的,那么,每一次要找下一条
的话,需先找到主键 ,固定长度的表也更容易被缓存和重建 ,不过定长的会浪费空间。
4、ENUM代替VARCHAR
ENUM类型实际保存的是TINYINT,如果字段的取值是有限而且固定的,可以使用ENUM提高性能