一、mysql数据库常见数据类型
数值型、日期/时间、字符串。
数值型:int、smallint、tinyint、mediumint、bigint ;浮点型:float、double、decimal(两数比较,大的+2)
日期/时间:date(YYYY-MM-DD)、time(HH:MM:SS)、year、datetime、timestamp(随其他字段修改自动刷新时间)
字符串:char(定长)、varchar(变长)、tinyblob、tinytext、blob(二进制长文本)、text(长文本)、medlumblob、medlumtext、longblob、longtext
二、事务
1.作用:
用于处理操作量大,复杂度高的数据。
2.事务的特性:
原子性:即不可分割性,一个事务的所有操作要么都完成,要么都完不成,执行过程中发生错误回滚到事务开始前的状态。
一致性:数据的修改符合预设规则,数据间的联系规则正常自发性地完成,如B给A转账100,A的金额+100,B的金额就必须-100。
隔离性:多个并发事务不能同时对同一行数据进行修改。事务隔离级别:未提交、读提交、可重复读、串行化。
持久性:事务对数据的修改是永久的。
3.如何开启事务
begin 或 start
4.索引优缺点
优点:大大提高了查询速度。缺点:占用磁盘空间,降低表的更新速度。
5.创建索引语法
create index [tablename] on [tablename]([indexfield]);
6.如何防止出现重复数据
使用 PRIMARY KEY 主键或者 UNIQUE 唯一索引来保证数据的唯一性。insert ignore into在插入数据时,数据库中已存在的数据会忽略。
7.过滤重复数据
需要读取不重复数据可以使用 DISTINCT 或者 GROUP BY。
8.删除重复数据
第一种方法:将原表数据通过 GROUP BY 查询出来并复制到临时表中,删除原表,将临时表改名。
第二种方法:修改表结构,添加唯一索引或主键。
9.sql注入5种漏洞
数据库联合查询注入攻击、数据库报错查询注入攻击、字符型数据库注入攻击、数据库盲注sql注入攻击、字符型注入攻击。
10.防止sql注入方法
pymysql中使用args传递参数,pymysql会对参数进行自动转义。
限制特殊字符的输入,如单引号,逗号,*,反斜杠,写入过滤代码过滤带有AND 1=1、select、union等的数据。
开启网站防火墙,IIS防火墙,apache防火墙,nginx防火墙都有内置过滤sql注入的参数。
11.mysql导出数据及备份
导出:SELECT * FROM table INTO OUTFILE '/tmp/runoob.txt'
备份:mysqldump -u root -p --all-databases > database_dump.txt
12.mysql导入数据
mysql -u root -p 密码 < runoob.sql
source /home/abc/abc.sql (要进入数据库)
mysqlimport -u root -p --local database_name dump.txt
13.数据库常见函数
replace, reverse, strcmp, upper, abs, avg, count, floor, max, min, sum, current_date, localtimestamp, now, cast(x as type)转换数据类型如字符串日期转日期
14.触发器、存储过程、视图
触发器:满足触发条件时,系统自动执行触发器的触发体,可调用多个存储过程。触发时间:before, after,触发事件:insert, update, delete,触发类型:行触发,语句触发。
存储过程:编译好的sql语句集合。优点:运行速度快,保证数据安全性和完整性,减少网络流量,重复性;缺点:调试麻烦,维护麻烦,不易移植,存在重新编译问题。
视图:select返回结果组成的虚拟表,类似存储过程,但存储过程范围更广,可以传参数。
15.内存溢出和内存泄漏
内存溢出:指程序在申请内存时,没有足够的内存空间供其使用。
内存泄漏:指程序在申请内存后,无法释放已申请的内存空间。
16.查看、更改表结构命令
查看:desc table_name;
更改:alter table [table_name] drop/add/modify/change [字段]
17.mysql常见数据库引擎及区别
常见引擎有InnoDB、MyISAM、MEMORY(HEAP)、BLACKHOLE
MyISAM:高速存储和检索,有全文搜索能力,不支持事务,只有表级锁,没有行级锁,不支持外键。
InnoDB:支持事务、外键、行级锁、并发控制,提供了事务安全,但其写入数据速度慢,占用磁盘空间大。
MEMORY:放在内存中的表,关机或重启,数据消失。
BLACKHOLE:写入的任何数据都会消失,用于记录二进制sql语句用于主从复制中的中继存储。
18.mysql索引种类
普通索引,唯一索引,主键索引,组合索引,全文索引
19.索引合并、覆盖索引、分库分表、聚集索引、辅助索引、读写分离
索引合并:指使用多个索引查询,然后合并结果。
覆盖索引:所查询数据的列只需从索引中就能得到,不必读取数据行。
分库分表:垂直切分指依据不同的表分给不同的数据库,水平切分指依据表中数据的逻辑关系,将同一个表数据拆分到多个表中。
聚集索引:索引表的树的叶子节点存放整行数据,每个叶子节点通过双向链表连接。
辅助索引:叶子节点只包含索引列的值和主键id,不需双向链表。
读写分离:让主数据库处理事务性增(insert)、删(delete)、改(update),从数据库处理查询(select)操作。
20.创建索引但无法命中索引的情况
- 使用通配符%和_开头的模糊查询
- 条件中有or,条件字段不全是索引字段
- 组合索引没有用到索引的第一个字段(没有遵循最左前缀规则)
- 查询列类型是字符串,但没用引号引起来
- 查询范围较大
- 使用反向条件,如not、!、<>
21.数据库优化方案
- 尽量使用char代替varchar,尽量不使用*,尽量不使用游标
- 使用join代替子查询
- 使用联合(union)代替手动创建临时表
- 创建索引
- 尽量避免进行null值判断
- update语句,更改少量字段不要update全部字段
- 分库分表
- 读写分离
- 调整数据库引擎
- 优化查询语句
22.mysql慢日志
记录运行时间超过预设值的日志。