一.数据库索引基础
索引的概念
- 索引是一种特殊的文件,包含着数据表中所有记录的引用指针。即数据库索引相当于一本书的目录,能够加快数据库的查询速度。数据库索引就是为了提高表的搜索效率而对某些字段的值建立起来的目录
索引的作用
- 建立索引的目的是为了加快对表中记录的查找或排序。为表设置索引要付出代价:一是增加了数据库的存储空间,二是在插入和修改数据时要花费比较多的时间(索引也要随之变动)。
- 设置了合适的索引之后,数据利用各种快速的定位技术,可以大大加快数据的查询速度,这是创建索引的最主要的原因
- 当表很大时,或者查询多个表时,使用索引的可以加快查询速度
- 索引也可以降低数据库的I/O成本,并且索引还可以降低数据库的排序成本
- 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
- 索引可以加快表与表之间的连接
在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间
索引的分类(MySQL)
- 普通索引,这是最基本的索引类型,而且它没有唯一性之类的限制
- 唯一性索引,这种索引和前面“普通索引”基本相同,但有一个区别:索引列的所有值只能出现一次,即必须唯一
- 主键索引,主键是一种唯一性索引,但是它必须指定为“primary key”。在数据库中表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型
- 全文索引,索引类型为 fulltext,全文索引可以在char、varchar 或者 text 类型的列上创建
- 单索引与多列索引,索引可以是单列上创建的索引,可以是在多列上创建的索引。而且多列索引可以区分其中一列可能相同值的行
创建索引的原则依据
- 表的主键、外键必须有外键。主键具有唯一性,索引值也是唯一的,查询时可以快速定位到数据行。外键一般关联的是另一个表的主键,所以在多表查询的时候也可以快速定位
- 数据量超过300行的表应该有索引。数据量较大时,如果没有索引,需要把表遍历一遍,严重影响数据库的性能
- 经常与其他数据表进行表连接的数据表,在连接字段上应该建立索引
- 唯一性太差的字段不合适建立索引
- 更新太频繁的字段不适合创建索引。在表中进行增、删、改时,索引也应该有相应的操作。字段更新的过于频繁,对于系统的资源占用也会更多
- 经常出现在Where语句的字段,应该建立索引
- 索引应该建在选择性高的字段上。如果很少的字段拥有相同值,即有很多独特值,则选择性很高
- 索引应该建立在小字段上,对于大的文本字段甚至超长字段,不要建立索引
二.创建索引与查看索引
安装MySQL5.6版本
//安装环境依赖包
yum install -y ncurses-devel autoconf cmake gcc gcc-c++
//解压缩包
tar xzvf mysql-5.6.26.tar.gz
cd mysql-5.6.26
//配置过程
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ //定义安装目录
-DDEFAULT_CHARSET=utf8 \ //安装中文识别的字符集
-DDEFAULT_COLLATION=utf8_general_ci \ //安装中文识别的字符集
-DEXTRA_CHARSETS=all \
-DSYSCONFIDIR=/etc \ //定义配置文件安装目录
-DMYSQL_DATADIR=/home/mysql/ \ //数据存放位置目录
-DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock //连接数据库文件
//安装与编译
make && make install
//覆盖原有的主配置文件
cp support-files/my-default.cnf /etc/my.cnf
//复制一份启动脚本文件到service中
cp support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld //添加权限
chkconfig --add /etc/init.d/mysqld //添加,可使用service管理数据库
chkconfig mysqld --level 35 on //添加,开机自启动
//设置环境变量,是系统识别mysql数据库内部命令
echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile
echo $PATH
//创建管理用户
useradd -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql/
//初始化数据库
/usr/local/mysql/scripts/mysql_install_db \
--user=mysql \
--ldata=/var/lib/mysql \
--basedir=/usr/local/mysql \
--datadir=/home/mysql
//建立软连接文件
ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock
//指向路径
vim /etc/init.d/mysqld
basedir=/usr/local/mysql //数据库目录
datadir=/home/mysql //数据存放目录
//开启服务
service mysqld start
netstat -anpt | grep 3306
//添加账户,进入数据库
mysqladmin -u root -p password "abc123" //给root账号设置密码
mysql -u root -p
//进入数据库
mysql -uroot -p
Enter password:
//创建数据库和数据表,添加数据记录
mysql> create database info;
Query OK, 1 row affected (0.02 sec)
//创建表的结构
mysql> create table yun (
-> id int(4) not null primary key auto_increment,
-> name char(10) not null,
-> addr varchar(50) default 'nj',
-> age int(4) not null,
-> ho int(4) not null);
Query OK, 0 rows affected (0.02 sec)
//查询表的结构
mysql> desc yun;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(4) | NO | PRI | NULL | auto_increment |
| name | char(10) | NO | | NULL | |
| addr | varchar(50) | YES | | nj | |
| age | int(4) | NO | | NULL | |
| ho | int(4) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
//插入数据
mysql> select * from yun;
+----+----------+---------+-----+----+
| id | name | addr | age | ho |
+----+----------+---------+-----+----+
| 1 | zhangsan | bj | 19 | 1 |
| 3 | lisi | default | 22 | 2 |
| 4 | wangwu | sh | 26 | 3 |
| 5 | zhaoliu | tj | 22 | 4 |
| 6 | tianqi | default | 21 | 5 |
+----+----------+---------+-----+----+
5 rows in set (0.00 sec)
创建索引、查看索引
创建普通索引
创建唯一性索引
创建主键索引,有两种方式
- 一种是创建表的同时指定主键,主键索引会自动创建(primary key)
- 另一种是,创建表没有指定主键,然后修改表加入主键,主键索引会自动创建()
一.创建表时添加主键,生成主键索引
二.将未设置主键的表添加主键索引
删除索引
mysql> show index from yun;
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| yun | 0 | PRIMARY | 1 | id | A | 5 | NULL | NULL | | BTREE | | |
| yun | 0 | unique_ho | 1 | ho | A | 5 | NULL | NULL | | BTREE | | |
| yun | 1 | index_yun | 1 | name | A | 5 | NULL | NULL | | BTREE | | |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+--
mysql> drop index index_yun on yun;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show index from yun;
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| yun | 0 | PRIMARY | 1 | id | A | 5 | NULL | NULL | | BTREE | | |
| yun | 0 | unique_ho | 1 | ho | A | 5 | NULL | NULL | | BTREE | | |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)
三.MySQL事务的概念以及特点
事务的概念
- 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即一组数据库命令要么都执行,要么都不执行
- 事务一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。
- 事务适用于用户同时操作数据库系统,通过事务的整体性以保证数据的一致性。
- 事务是保证了一组操作的平稳性和可预测的技术
四.MySQL操作事务
MySQL事务
- 默认情况下,MySQL的事务是自动提交的。之前我们用SQL语句操作数据库时,一条语句执行后,系统会自动执行事务提交。当需要一组语句作为一个事务提交时,需要手动对事务进行控制。手动控制事务两种方法,一种使用事务命令控制,另一种是使用set设置事务的处理方式
使用事务命令控制事务
- MySQL中使用命令控制事务的3个命令
- begin:表示事务的开始,后面会有多条数据库操作语句执行
- commit:表示提交一个事务,对应前面的begin操作,他们之间的数据库操作语句一起完成
- rollback:表示回滚一个事务,在begin和commit之间,如果某一个数据库操作语句出现错误,执行rollback回滚,数据库回到begin之前的状态,也就是操作语句都没执行
具体操作
使用begin开始事务,插入两条语句
使用set设置控制事务
- MySQL默认是自动提交事务,也可以修改为不自动提交事务
当我们把autocommit的值改为0时,则需要手动提交,即用commit提交,回滚使用rollback
//关闭自动提交事务
mysql> set autocommit=1;
Query OK, 0 rows affected (0.01 sec)
//插入数据
mysql> insert into hobby (id,ho_name) values (5,'game');
Query OK, 1 row affected (0.00 sec)
mysql> insert into hobby (id,ho_name) values (6,'play');
Query OK, 1 row affected (0.00 sec)
//rollback回滚到最初状态,
//commit提交事务,数据会直接保存到硬盘中
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from hobby;
+----+---------+
| id | ho_name |
+----+---------+
| 5 | game |
| 6 | play |
+----+---------+
2 rows in set (0.00 sec)
五.视图
视图是一张虚拟的表,数据不存在视图中,真实表的映射数据,利用条件筛选、分组、排序等产生出一个结果集,并且做成持久化保存
视图能够方便友好的查询数据,基本不占用空间
真实数据变化,视图数据会同时变化
视图的作用:
- 方便sql操作
- 不通过权限用户的信息浏览
- 安全
mysql> create view view_name as select id,name from yun;
Query OK, 0 rows affected (0.02 sec)
mysql> select * from view_name;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 3 | lisi |
| 4 | wangwu |
| 5 | zhaoliu |
| 6 | tianqi |
| 9 | pan |
| 10 | yu |
+----+----------+
7 rows in set (0.00 sec)
存储过程
- 存储过程多用于软件开发方向,防止代码在网络传输过程中被截获,做了安全性保障
- 原始状态:代码中需要嵌入sql语句,通过连接驱动,把sql语句作为参数传递给mysql(数据库)进行执行
- 存储过程是写在数据库中,并不是程序中
- 程序是通过调用存储过程名称去触发sql操作
- 优点:代码量优化,传输安全,网络优化