一、数据库的基本概念
1、数据库
数据库就是一个存储数据的仓库。
数据库是以一定方式存储在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。
它的存储空间很大,可以存放数百万条、千万条、上亿条数据。
数据库目前主要有两种:关系型数据库和非关系型数据库。
2、关系型数据库
关系型数据库,存储的格式可以直观地反映实体间的关系。关系型数据库和常见的表格比较相似,关系型数据库中表与表之间是有很多复杂的关联关系的。
常见的关系型数据库有MySQL、SQL Server等。
3、非关系型数据库
随着近些年技术方向的不断扩展,大量的非关系型数据库如MongoDB、Redis、memcached出于简化数据库结构、避免冗余、影响性能的表链接、摒弃复杂分布式的目的被设计。
非关系型数据库适合追求速度和可扩展性、业务多变的应用场景。
4、MySQL
MySQL是最流行的关系型数据库管理系统,在Web应用方面MySQL是最好的RDBMS(关系数据库管理系统)应用软件之一。特点如下:
- 由瑞典MySQL AB公司开发,目前属于Oracle公司
- 开源
- MySQL使用标准的SQL数据语言形式
- 可运行于多个系统上,比如,Mac、Linux、Windows
- 支持多种语言包括C、C++、Python、Java、PHP、Go等
- MySQL可以定制,采用了GPL协议,可以通过修改源码来开发自己的MySQL系统。
RDBMS术语:
- 数据库:数据库是一些关联表的集合。
- 数据表:表是数据库的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
- 列:一列(数据元素)包含了相同类型的数据。
- 行:一行(元组,或者记录)是一组相关的数据。
事务的4个条件:
- 原子性:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
- 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
- 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交、读提交、可重复读和串行化。
- 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
二、MySQL学习
1、安装mysql(ubuntu)
sudo apt-get install mysql-server -y
默认情况下root用户不需要密码登录,为mysql增加用户:
sudo mysql
create user 'user'@'localhost' identified by 'pasword';
创建一个数据库给user用:
create database fingerprint;
授权:
grant all on fingerprint.* to 'user'@'localhost';
登录:
mysql -h ip -P port -u user -p
2、常用命令
查看数据库:show databases;
使用数据库:use fingerprint;
删除数据库:drop database fingerprint;
查看表:show tables;
创建表:create table scan(ip varchar(16),fingerprint varchar(100),model varchar(50),version varchar(50));
删除表:drop table scan;
向表中插入数据:insert into scan values("192.168.2.2","ashdoasdajsiuduasoasd","WNDR3800","16");
查询:select fingerprint from scan where binary ip="192.168.2.2" and version="1 6";
其中binary
表示区分大小写,因为where
不区分。
更新:update scan set version="18",model="WNDR3700" where ip="192.168.2.2";
删除:delete from scan where ip="1";
模糊匹配like的使用:select * from scan where ip like "%2.2";
union查询结果合并去重:select country from Websites union select country from apps;
排序(asc是升序,desc是降序):select * from runoob_tbl order by submission_date asc
分组并统计数量:select ip,count(*) from scan group by ip;
BULL值:is null
或者is not null
正则表达式regexp:select * from scan where ip regexp '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+';
事务开始:begin;
事务提交:commit;
事务回滚:rollback;
添加索引:alert table scan add index indexscan(version)
索引创建原则:
-
索引并非越多越好,一个表中如果有大量的索引,不仅占用磁盘空间,而且会影响INSERT、DELETE、UPDATE等语句的性能,因为在表中的数据更改的同时,索引也会进行调整和更新
-
避免对经常更新的表进行过多的索引,并且索引中的列尽可能少。而对经常用于查询的字段应该创建索引,但要避免添加不必要的字段。
-
数据量小的表最好不要使用索引,由于数据较少,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果。
-
在条件表达式中经常用到的不同值较多的列上建立索引,在不同值很少的列上不要建立索引。
-
当唯一性是某种数据本身的特征时,指定唯一索引。使用唯一索引需能确保定义的列的数据完整性,以提高查询速度。
-
在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。
-
搜索的索引列,不一定是所要选择的列。换句话说,最适合索引的列是出现在WHERE子句中的列,或连接子句中指定的列,而不是出现在SELECT关键字后的选择列表中的列。
-
使用短索引。如果对字符串列进行索引,应该指定一个前缀长度,只要有可能就应该这样做。例如,有一个CHAR(200)列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。对前10个或20个字符进行索引能够节省大量索引空间,也可能会使查询更快。较小的索引涉及的磁盘 IO 较少,较短的值比较起来更快。更为重要的是,对于较短的键值,索引高速缓存中的块能容纳更多的键值,因此,MySQL 也可以在内存中容纳更多的值。这样就增加了找到行而不用读取索引中较多块的可能性。
-
利用最左前缀。在创建一个n列的索引时,实际是创建了MySQL可利用的n个索引。多列索引可起几个索引的作用,因为可利用索引中最左边的列集来匹配行。这样的列集称为最左前缀。
序列:(id INT NOT NULL AUTO_INCREMENT)
函数:函数表
3、注意
- 连接非常复杂,尽量使用长连接,少用短链接。