数据库学习之MySQL进阶

数据库进阶

一、索引

1.索引简介
索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。

索引优化应该是对查询性能优化最有效的手段了。
索引能够轻易将查询性能提高好几个数量级。
索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。

索引特点:创建与维护索引会消耗很多时间与磁盘空间,但查询速度大大提高!

2.创建索引语法

--创建表时
CREATE TABLE 表名 (
字段名1 数据类型 [完整性约束条件…],
字段名2 数据类型 [完整性约束条件…],
[UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
[索引名] (字段名[(长度)] [ASC |DESC])
);

实例:

CREATE TABLE test2(
  id INT,
  name VARCHAR(20),
  INDEX index_name (name)
  );

--添加索引

---CREATE在已存在的表上创建索引
CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
ON 表名 (字段名[(长度)] [ASC |DESC]) ;

---ALTER TABLE在已存在的表上创建索引

ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
索引名 (字段名[(长度)] [ASC |DESC]) ;

CREATE INDEX index_emp_name on emp1(name);
ALTER TABLE emp2 ADD UNIQUE INDEX index_bank_num(band_num);

-- 删除索引

语法:DROP INDEX 索引名 on 表名

DROP INDEX index_emp_name on emp1;
DROP INDEX bank_num on emp2;

3.索引测试实验

--创建表
create table t1(id int,name varchar(20));

--存储过程

delimiter $$
create procedure autoinsert()
BEGIN
declare i int default 1;
while(i<5000)do
insert into t1 values(i,‘yuan‘);
set i=i+1;
end while;
END$$

delimiter ;

--调用函数
call autoinsert();

-- 花费时间比较:
-- 创建索引前
select * from t1 where id=300000;--0.32s
-- 添加索引
create index index_id on t1(id);
-- 创建索引后
select * from Indexdb.t1 where id=300000;--0.00s
--删除索引
drop index index_id on t1;

实验二:

use crawed;
desc doutula;
select count(*) from doutula;
+----------+
| count(*) |
+----------+
| 27308 |
+----------+
select name from doutula where name like ‘%坏蛋%‘;
--34 rows in set (0.53 sec)
create index index_name on doutula (name);
select name from doutula where name like ‘%坏蛋%‘;
--34 rows in set (0.05 sec)

4.正确使用索引
  数据库表中添加索引后确实会让查询速度起飞,但前提必须是正确的使用索引来查询,如果以错误的方式使用,则即使建立索引也会不奏效。
即使建立索引,索引也不会生效:

 - like ‘%xx‘
            select * from tb1 where name like ‘%cn‘;
        - 使用函数
            select * from tb1 where reverse(name) = ‘wupeiqi‘;
        - or
            select * from tb1 where nid = 1 or email = ‘[email protected]‘;
            特别的:当or条件中有未建立索引的列才失效,以下会走索引
                    select * from tb1 where nid = 1 or name = ‘seven‘;
                    select * from tb1 where nid = 1 or email = ‘[email protected]‘ and name = ‘alex‘
        - 类型不一致
            如果列是字符串类型,传入条件是必须用引号引起来,不然...
            select * from tb1 where name = 999;
        - !=
            select * from tb1 where name != ‘alex‘
            特别的:如果是主键,则还是会走索引
                select * from tb1 where nid != 123
        - >
            select * from tb1 where name > ‘alex‘
            特别的:如果是主键或索引是整数类型,则还是会走索引
                select * from tb1 where nid > 123
                select * from tb1 where num > 123
        - order by
            select email from tb1 order by name desc;
            当根据索引排序时候,选择的映射如果不是索引,则不走索引
            特别的:如果对主键排序,则还是走索引:
                select * from tb1 order by nid desc;

        - 组合索引最左前缀
            如果组合索引为:(name,email)
            name and email       -- 使用索引
            name                 -- 使用索引
            email                -- 不使用索引

  二、limit分页

每页显示10条:
    当前 118 120, 125

    倒序:
                大      小
       970  7 6  6 5  54  43  32
    19 98
    下一页:

        select
            *
        from
            tb1
        where
            nid < (select nid from (select nid from tb1 where nid < 当前页最小值 order by nid desc limit 每页数据 *【页码-当前页】) A order by A.nid asc limit 1)
        order by
            nid desc
        limit 10;

        select
            *
        from
            tb1
        where
            nid < (select nid from (select nid from tb1 where nid < 970  order by nid desc limit 40) A order by A.nid asc limit 1)
        order by
            nid desc
        limit 10;

    上一页:

        select
            *
        from
            tb1
        where
            nid < (select nid from (select nid from tb1 where nid > 当前页最大值 order by nid asc limit 每页数据 *【当前页-页码】) A order by A.nid asc limit 1)
        order by
            nid desc
        limit 10;

        select
            *
        from
            tb1
        where
            nid < (select nid from (select nid from tb1 where nid > 980 order by nid asc limit 20) A order by A.nid desc limit 1)
        order by
            nid desc
        limit 10;

  三、Python关于MySQL的API接口-pymysql模块  

pymsql是Python中操作MySQL的模块,其使用方法和py2的MySQLdb几乎相同。
安装:pip install pymysql

代码:

# -*- coding: utf-8 -*-
import pymysql

#1.连接mysql
conn = pymysql.connect(host=‘localhost‘,port=3306,user=‘root‘,password=‘0000‘,db=‘python3‘)
# conn = pymysql.connect(host=‘localhost‘,user=‘root‘,password=‘0000‘,db=‘crawed‘,charset=‘utf8‘,cursorclass = pymysql.cursors.DictCursor,use_unicode=True)
#2.创建游标
cursor = conn.cursor()
# cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  #更改获取数据结果的数据类型

#3.创建表添加数据
# sql = ‘create table test(id int,name varchar(20))‘
# sql1 = "insert into test values (1,‘zhang‘),(2,‘fei‘);"
# cursor.execute(sql)
# cursor.execute(sql1)

#4.查询数据
sql2 = ‘select * from test;‘
cursor.execute(sql2)
# num = cursor.fetchone()
# print(cursor.fetchone())
# print(cursor.fetchmany(2))
print(cursor.fetchall())

#5.scroll  控制游标位置
# print(cursor.fetchone())
# print(cursor.fetchone())
# cursor.scroll(-1,mode=‘relative‘)  # 相对当前位置移动
# cursor.scroll(0,mode=‘absolute‘) # 相对绝对位置移动
# print(cursor.fetchone())

conn.commit()
conn.close()

    四、事务     

事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。

数据库开启事务命令
-- start transaction 开启事务
-- Rollback 回滚事务,即撤销指定的sql语句(只能回退insert delete update语句),回滚到上一次commit的位置
-- Commit 提交事务,提交未存储的事务
-- savepoint 保留点 ,事务处理中设置的临时占位符 你可以对它发布回退(与整个事务回退不同)
转账实例:

select * from test;
+------+-------+--------+
| id | name | salary |
+------+-------+--------+
| 1 | zhang | 8000 |
| 2 | fei | 10000 |
| 3 | kobe | 8000 |
| 4 | james | 9000 |
+------+-------+--------+
4 rows in set (0.00 sec)
start transaction;
update test set salary=salary-5000 where id=2;
rollback;
update test set salary=salary-5000 where id=2;
update test set salary=salary+5000 where id=1;
commit;

savepoint

create table test2(id int PRIMARY KEY auto_increment,name VARCHAR(20)) engine=innodb;
INSERT INTO test2(name) VALUE ("alvin"),
                              ("yuan"),
                              ("xialv");

start transaction;
insert into test2 (name)values(‘silv‘);
select * from test2;
commit;

-- 保留点

start transaction;
insert into test2 (name)values(‘wu‘);
savepoint insert_wu;
select * from test2;

delete from test2 where id=4;
savepoint delete1;
select * from test2;

delete from test2 where id=1;
savepoint delete2;
select * from test2;

rollback to delete1;

select * from test2;

savepoint

事务特性

<1> 原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

<2> 一致性(Consistency):事务前后数据的完整性必须保持一致。在事务执行之前数据库是符合数据完整性约束的,无论事务是否执行成功,事务结束后的数据库中的数据也应该是符合完整性约束的。在某一时间点,如果数据库中的所有记录都能保证满足当前数据库中的所有约束,则可以说当前的数据库是符合数据完整性约束的。
比如删部门表前应该删掉关联员工(已经建立外键),如果数据库服务器发生错误,有一个员工没删掉,那么此时员工的部门表已经删除,那么就不符合完整性约束了,所以这样的数据库也就性能太差啦!

<3>隔离性(Isolation):事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。

<4>持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

四个隔离级别:
Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)
Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)不可以避免虚读
Read committed:可避免脏读情况发生(读已提交)
Read uncommitted:最低级别,以上情况均无法保证。(读未提交)

安全性考虑:Serializable>Repeatable read>Read committed>Read uncommitted
数据库效率:Read uncommitted>Read committed>Repeatable read>Serializable

一般情况下,我们会使用Repeatable read、Read committed mysql数据库默认的数据库隔离级别Repeatable read

mysql中设置数据库的隔离级别语句:set [global/session] transaction isolation level xxxx;

如果使用global则修改的是数据库的默认隔离级别,所有新开的窗口的隔离级别继承自这个默认隔离级别如果使用session修改,则修改的是当前客户端的隔离级别,和数据库默认隔离级别无关。当前的客户端是什么隔离级别,就能防止什么隔离级别问题,和其他客户端是什么隔离级别无关。
mysql中设置数据库的隔离级别语句:select @@tx_isolation;

原文地址:https://www.cnblogs.com/zhangyafei/p/9649259.html

时间: 2024-10-10 14:29:49

数据库学习之MySQL进阶的相关文章

Mysql数据库学习之mysql半同步复制简析

从5.7版本开始MySQL通过扩展的方式支持了半同步复制,当主库执行一个更新操作事务时,提交操作会被阻止直到至少有一个半同步的,复制slave确认已经接收到本次更新操作,主库的提交操作才会继续,半同步复制的slave发送确认消息只会在本次更新操作记录已经记录到本地的relay log之后,如果没有任何slave发送确认消息而导致超时时,半同步复制会转换成异步复制. 半同步复制会对MySQL性能产生影响,因为主库的提交动作只有在收到至少一个从库的确认消息之后才能执行.但这个功能是性能和数据可靠性方

MySql数据库学习总结(MySQL入门到精通)

2017.1.24-2.3日(在大兴实验室) 1.数据库存储引擎: (1)MyISAM: 访问速度快,对事物完整性没要求,并以访问为主的适合这个 (2)InnoDB: 更占磁盘空间,需要进行频繁的更新.删除操作,对事物完整性要求比较高,需要实现并发控制时适合. (3)MEMORY:内存存储数据,访问比较快,但是安全无保障,数据小的时候适合这个. 2.创建视图: create view view-name as +sql语句  即封装sql语句,利于复用. create view view_pro

MySQL数据库学习三 MySQL数据库基本操作

3.1 数据库和数据对象 1. 系统数据库 information_schema:主要存储系统中的一些数据库对象信息,如用户列表信息.列信息.权限信息.字符集信息和分区信息等. performance_schema:主要存储数据库服务器性能参数. mysql:主要存储系统的用户权限信息. test:测试数据库,任何用户都可以使用. 2. 用户数据库 数据库对象,是指存储.管理和使用数据的不同结构形式,主要包含表.视图.存储过程.函数.触发器和事件等. 3.2 数据库相关操作 1. 创建数据库 c

数据库学习之MySQL基础

数据库基础 一.数据库简介 数据库:存放数据的仓库 sql及其规范 sql是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出"做什么"的命令,"怎么做"是不用使用者考虑的.SQL功能强大.简单易学.使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持sql. <1> 在数据库系统中,SQL语句不区分大小写(建议用大写) .但

数据库学习之mysql数据库

参考链接网站: http://c.biancheng.net/view/2361.html Mysql的版本以及版本号 MySQL Community Server(社区版):该版本完全免费,但是官方不提供技术支持. MySQL Enterprise Server(企业版):该版本能够以很高的性价比为企业提供数据仓库应用,支持 ACID 事物处理,提供完整的提交.回滚.崩溃恢复和行级锁定功能,但是该版本需要付费使用,官方提供电话技术支持. Mysql服务器端实用工具: http://c.bian

数据库学习笔记——MySQL卸载

1.控制面板里的增加删除程序内进行删除 2.删除MySQL文件夹下的my.ini文件,如果备份好,可以直接将文件夹全部删除 3.看看注册表里这几个地方删除没有 HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/Eventlog/Application/MySQL 目录删除 HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/Services/Eventlog/Application/MySQL 目录删除 HKEY_LOC

MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

首先需要回顾一下上一篇文章中的内容:MySQL数据库学习笔记(九)----JDBC的PreparedStatement接口重构增删改查 一.JDBC事务处理: 我们已经知道,事务的概念即:所有的操作要么同时成功,要么同时失败.在MySQL中提供了Commit.Rollback命令进行事务的提交与回滚.实际上在JDBC中也存在事务处理,如果要想进行事务处理的话,则必须按照以下的步骤完成. JDBC中事务处理的步骤: 1.要取消掉JDBC的自动提交:void setAutoCommit(boolea

数据库学习之--Oracle 架构与MySQL架构对比

数据库学习之--Oracle 架构与MySQL架构对比 一.Oracle .MySQL应用对比 如果要说明三者的区别,首先就要从历史入手. Oracle:中文译作甲骨文,这是一家传奇的公司,有一个传奇的大老板Larry Ellision. Ellision 32岁还一事无成,读了三个大学,没得到一个学位文凭,换了十几家公司,老婆也离他而去.开始创业时只有1200美元,却使得Oracle公司连续12年销售额每年翻一番. Oracle成立于1977年,早期的理论基础,反而来自于一篇IBM的论文<A

MYSQL数据库学习笔记1

MYSQL数据库学习笔记1 数据库概念 关系数据库 常见数据库软件 SQL SQL的概念 SQL语言分类 数据库操作 创建数据库 查看数据库的定义 删除数据库 修改数据库 创建表 数据类型 约束 修改表 表的增删查改 查询 数据库概念 数据库是一种对大量信息进行管理的一种方法. 数据库系统从结构上看,也是可以分为三层的: 物理层:数据实际如何存储 逻辑层:存储的是什么数据,以及数据间是什么关系 试图层:提供给用户的部分数据 关系数据库 目前关于数据库模型最主流的有两种, 一种叫做关系型数据库,这