zoukankan      html  css  js  c++  java
  • 【python之路】数据库2

    一、数据库存储引擎

      1.什么是存储引擎

      mysql中建立的库===>文件夹

      库中建立的表===>文件 

      现实生活中我们用来存储数据的文件应该有不同的类型:比如存文本用txt类型,存表格用excel,存图片用png等

      数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。  

      存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)  

      在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎

    二、mysql支持的存储引擎

    MariaDB [(none)]> show enginesG  #查看所有支持的存储引擎
    MariaDB [(none)]> show variables like 'storage_engine%'; #查看正在使用的存储引擎

    MySQL常用的存储引擎
    MyISAM存储引擎
    由于该存储引擎不支持事务、也不支持外键,所以访问速度较快。因此当对事务完整性没有要求并以访问为主的应用适合使用该存储引擎。

    InnoDB存储引擎(主要使用)
    由于该存储引擎在事务上具有优势,即支持具有提交、回滚及崩溃恢复能力等事务特性,所以比MyISAM存储引擎占用更多的磁盘空间。因此当需要频繁的更新、删除操作,同时还对事务的完整性要求较高,需要实现并发控制,建议选择。

    MEMORY
    MEMORY存储引擎存储数据的位置是内存,因此访问速度最快,但是安全上没有保障。适合于需要快速的访问或临时表。

    BLACKHOLE
    黑洞存储引擎,可以应用于主备复制中的分发主库。

    三、使用存储引擎

      方法1:建表时指定

    MariaDB [db1]> create table innodb_t1(id int,name char)engine=innodb;
    MariaDB [db1]> create table innodb_t2(id int)engine=innodb;
    MariaDB [db1]> show create table innodb_t1;
    MariaDB [db1]> show create table innodb_t2;

      方法2:在配置文件中指定默认的存储引擎

    /etc/my.cnf
    [mysqld]
    default-storage-engine=INNODB
    innodb_file_per_table=1

      练习

      创建四个表,分别使用innodb,myisam,memory,blackhole存储引擎,进行插入数据测试

    MariaDB [db1]> create table t1(id int)engine=innodb;
    MariaDB [db1]> create table t2(id int)engine=myisam;
    MariaDB [db1]> create table t3(id int)engine=memory;
    MariaDB [db1]> create table t4(id int)engine=blackhole;
    MariaDB [db1]> quit
    [root@egon db1]# ls /var/lib/mysql/db1/ #发现后两种存储引擎只有表结构,无数据
    db.opt  t1.frm  t1.ibd  t2.MYD  t2.MYI  t2.frm  t3.frm  t4.frm
    
    #memory,在重启mysql或者重启机器后,表内数据清空
    #blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录

    四、索引

      1.索引简介

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

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

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

      2.索引语法

      2.1:创建索引

    --创建表时
    --语法:
        CREATE TABLE 表名 (
                    字段名1  数据类型 [完整性约束条件…],
                    字段名2  数据类型 [完整性约束条件…],
                    [UNIQUE]   INDEX | KEY
                    [索引名]  (字段名[(长度)]  [ASC |DESC])
                    );
    
    --------------------------------
    
    --创建普通索引示例:
    
        CREATE TABLE emp1 (
            id INT,
            name VARCHAR(30) ,
            resume VARCHAR(50),
            INDEX index_emp_name (name)
        --KEY index_dept_name (dept_name)
            );
    
    
    --创建唯一索引示例:
    
        CREATE TABLE emp2 (
            id INT,
            name VARCHAR(30) ,
            bank_num CHAR(18) UNIQUE ,
            resume VARCHAR(50),
            UNIQUE INDEX index_emp_name (name)
            );
    
    --创建全文索引示例:
    
        CREATE TABLE emp3 (
            id INT,
            name VARCHAR(30) ,
            resume VARCHAR(50),
            FULLTEXT INDEX index_resume (resume)
            );
    
    --创建多列索引示例:
    
        CREATE TABLE emp4 (
            id INT,
            name VARCHAR(30) ,
            resume VARCHAR(50),
            INDEX index_name_resume (name,resume)
            );
    
    ---------------------------------

      2.2:添加和删除索引

    ---添加索引
    
        ---CREATE在已存在的表上创建索引
          CREATE  [UNIQUE]  INDEX  索引名
                  ON 表名 (字段名[(长度)]  [ASC |DESC]) ;
        
        ---ALTER TABLE在已存在的表上创建索引
        
          ALTER TABLE 表名 ADD  [UNIQUE] 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 Indexdb.t1(id int,name varchar(20));
    
    
    --存储过程
    
    delimiter $$     #设置sql语句结束符号为$$
    create procedure autoinsert()   #创建插入函数
    BEGIN                                    #mysql用begin和end来表示缩进
    declare i int default 1;            #定义i变量默认值为1
    while(i<500000)do
    insert into Indexdb.t1 values(i,'yuan');
    set i=i+1;
    end while;
    END$$
    
    delimiter ;      #把结束符号设置为;
    
    --调用函数
    call autoinsert();
    
    -- 花费时间比较:
    -- 创建索引前
       select * from Indexdb.t1 where id=300000;--0.32s
    -- 添加索引 
       create index index_id on Indexdb.t1(id);
    -- 创建索引后
       select * from Indexdb.t1 where id=300000;--0.00s                    

    五、pymysql模块

      pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。

      1.使用

    import pymysql
      
    # 创建连接
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
    # 创建游标
    cursor = conn.cursor()
      
    # 执行SQL,并返回收影响行数
    effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
      
    # 执行SQL,并返回受影响行数
    #effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))
      
    # 执行SQL,并返回受影响行数
    #effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
      
    # 提交,不然无法保存新建或者修改的数据
    conn.commit()
      
    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()

      2.获取新创建数据自增ID

    import pymysql
      
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
    cursor = conn.cursor()
    cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
    conn.commit()
    cursor.close()
    conn.close()
      
    # 获取最新自增ID
    new_id = cursor.lastrowid

      3.获取查询数据

    import pymysql
      
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
    cursor = conn.cursor()
    cursor.execute("select * from hosts")
      
    # 获取第一行数据
    row_1 = cursor.fetchone()
      
    # 获取前n行数据
    # row_2 = cursor.fetchmany(3)
    # 获取所有数据
    # row_3 = cursor.fetchall()
      
    conn.commit()
    cursor.close()
    conn.close()

      4.fetch数据类型

      关于默认获取的数据是元组类型,如果想要或者字典类型的数据,即:

    import pymysql
      
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
      
    # 游标设置为字典类型
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    r = cursor.execute("call p1()")
      
    result = cursor.fetchone()
      
    conn.commit()
    cursor.close()
    conn.close()
  • 相关阅读:
    线性回归的从零开始实现
    比赛总结
    计数学习笔记
    DP计数问题
    多项式学习笔记
    数据结构学习笔记
    子集运算学习笔记
    待学习
    ICPC2018焦作 题解
    ICPC2018焦作 H题 Can You Solve the Harder Problem?
  • 原文地址:https://www.cnblogs.com/78pikaqiu/p/7251476.html
Copyright © 2011-2022 走看看