Mysql存储引擎
一,执行sql语句:SHOW ENGINES \G 可查询数据库支持的引擎类型
注意以\G结尾的查询结果将更美观
由图可知Mysql 5.5默认存储引擎为InnoDB,或者可执行sql语句:
SHOW VARIABLES LIKE ‘storsgr_engine%’;直接查询当前默认引擎
二,修改my.ini中default_storage_engine来修改默认使用的存储引擎
三,各种存储引擎的特性及选择
MYISAM引擎:不支持事务和外键,访问速度比较快,适合不需要事务的访问为主应用
InnoDB引擎:支持事务和外键,比MYISAM引擎更占用空间,适合增删改操作和并发
MEMORY引擎:使用内存存储数据,适合数据量较小的快速访问
mysql中的基本数据类型
数值类型加上unsigned表示无符号化,只取正值,加上zerofill表示用0填充到指定位数
Float单精度有效数字8位,超出则四舍五入,如Float f =122.213123f;实际上f=122.21312,后面被舍掉。
Double双精度有效精度16位小数点,超出则四舍五入。
Float和Double也可以使用Float(M,D)和Double(M,D)的方法定义宽度,但是只能在8位和16位内保证精确性,其他位置不准确
Decimal定点数比Double的精度还要高,可以指定其精度M和小数点后位数D,如DEC(38,30)为整数8位,小数30位,
存入数据可以完全按照这个精度进行存储。存储货币单位时使用Decimal。
date为年月日 curdate()函数返回当前日期date类型数据,如2018-03-25
datetime为年月日时分秒 now()函数返回当前日期和时间datetime类型数据,如2018-03-25 0:15
timestamp为时间戳
time为时分秒 time(now())函数返回当前时间,如0:15
year为年份 year(now())函数返回当前年份,如2018
binary和blob都可以存储二进制文件(如图片,音乐,视频文件),前者存储较少量的数据,后者存储较大量的数据如电影。
索引
索引用于快速找到某个特定值得行,若没有索引,则从第一行开始读完整个表直到找到相关行。索引的存储类型有btree和hash,myisam和innodb引擎只支持btree索引,memory和heap引擎支持btree和hash两种索引,使用索引可以加快查询速度,但是索引过多也会增加数据空间和维护成本。可使用explain select * from user获得查询语句是否使用到了索引
索引类型:
一,普通索引和唯一索引
二,单列索引和组合索引
组合索引只有在查询时使用了最左侧字段才会生效
三,全文索引
可以在char,varchar,text字段上添加,只有myisam引擎支持该索引
四,空间索引
可在空间数据类型的字段上添加
索引设计原则:
一,避免添加过多索引,会影响select,update,delete性能
二,避免对经常更新的字段添加索引
三,数据量小的表不要索引,反而会降低查询速度
四,频繁分组group或排序order的字段添加索引
五,尽量使用短索引,指定前缀长度,如key 'name_index'(username(20)),表示对username字段前20个字符做索引,
短索引可提高查询速度和节省空间
存储过程和函数
存储过程相当于多条sql语句集,存储函数为自定义mysql函数
一,创建存储过程方法:
create procedure proc()
begin
select * from user;
end;
二,调用存储过程方法:
call proc();
三,创建存储函数方法:
create function fucexample()
returns char(50)
return(select * from user where id=0);
四,调用存储函数方法:
select funcexample();
五,查看存储过程和函数方法:
show procedure status like '%c';
show function status like '%e;
触发器trigger
触发器和存储过程类似,都是多个sql语句集,但是触发器是被update,delete,insert等事件被动触发,存储过程是主动调用
一,创建触发器方法:
create trigger my_trigger before insert on user for each row XXX执行体XXX:
该触发器在insert执行前先触发执行体内容
二,查看触发器方法:
show triggers;
备份和恢复
一,备份方法:
使用mysqldump命令可将数据库备份为sql文件
备份单个数据库所有表 mysqldump -u user -p password mydatabase;
备份单个数据库单个表 mysqldump -u user -p password mydatabase mytable;
备份多个数据库 mysqldump -u user -p password --databases mydatabase1 mydatabase2;
备份所有数据库 mysqldump -u user -p password --all-databases;
二,恢复方法:
导入备份的sql文件
mysql -u user -p password mybackupfilename;
性能优化
查看慢查询次数 show status like 'slow_queries';
一,优化查询
使用 explain select XX查询体XX; 来查看查询语句执行情况
若possible_keys和key为null,说明索引未生效,原因一般为:
1,模糊查询时第一个字符为%,只有%在最后才会生效
如select * from user where name like 'xxx%'
2,使用联合索引时,索引字段必须位于第一位才生效
3,使用or关键字查询时,or前后字段必须都是索引字段才会生效
子查询效率往往比较低,因为系统会为子查询建立临时表,从而影响效率,可把子查询用join替换,提高效率
如SELECT a.idcardNo, a.name, a.nickname, (SELECT b.nickname FROM cadre b WHERE b.name=a.name) AS nickname_b FROM student a;
可替换为SELECT a.idCardNo, a.name, a.nickname, b.nickname FROM student a LEFT JOIN cadre b ON a.name=b.name;
二,优化数据库结构
1,将字段很多的表拆分为多个表,不常用字段设新表
如用户信息可以拆分为member和member_info两个表,memb_info存储不常用的address,phone和desc字段
2,增加中间表
3,增加冗余字段