1. 程式人生 > >數據庫:數據庫引擎、索引、pymysql(四)

數據庫:數據庫引擎、索引、pymysql(四)

相對 記錄 崩潰恢復 sql rowid 訪問 roc 頻繁 元祖

一、數據庫存儲引擎

1、存儲引擎

mysql中建立的庫===>文件夾

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

現實生活中我們用來存儲數據的文件應該有不同的類型:比如存文本用txt類型,存表格用excel,存圖片用png等。

數據庫中的表也應該有不同的類型,表的類型不同,會對應mysql不同的存取機制,表類型又稱為存儲引擎。

存儲引擎說白了就是如何存儲數據、如何為存儲的數據建立索引和如何更新、查詢數據等技術的實現方
法。因為在關系數據庫中數據的存儲是以表的形式存儲的,所以存儲引擎也可以稱為表類型(即存儲和
操作此表的類型)。

在Oracle 和SQL Server等數據庫中只有一種存儲引擎,所有數據存儲管理機制都是一樣的。而MySql
數據庫提供了多種存儲引擎。用戶可以根據不同的需求為數據表選擇不同的存儲引擎,用戶也可以根據
自己的需要編寫自己的存儲引擎。

技術分享

2、mysql支持的存儲引擎

mysql> show engines\G;  #查看所有支持的存儲引擎
mysql> show variables like %storage_engine%;   #查看正在使用的存儲引擎

MySQL常用的存儲引擎

MyISAM存儲引擎
由於該存儲引擎不支持事務、也不支持外鍵,所以訪問速度較快。因此當對事務完整性沒有要求並以訪問為主的應用適合使用該存儲引擎。

InnoDB存儲引擎(主要使用
由於該存儲引擎在事務上具有優勢,即支持具有提交、回滾及崩潰恢復能力等事務特性,所以比MyISAM存儲引擎占用更多的磁盤空間。因此當需要頻繁的更新、刪除操作,同時還對事務的完整性要求較高,需要實現並發控制,建議選擇。

MEMORY
MEMORY存儲引擎存儲數據的位置是內存,因此訪問速度最快,但是安全上沒有保障。適合於需要快速的訪問或臨時表。

BLACKHOLE
黑洞存儲引擎,可以應用於主備復制中的分發主庫。

3、使用存儲引擎

方法1:建表時指定

mysql> create table innodb_t1(id int,name char)engine=innodb;
mysql> create table innodb_t2(id int)engine=innodb;
mysql> show create table innodb_t1;
mysql> show create table innodb_t2;

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

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

查看

[[email protected] db1]# cd /var/lib/mysql/db1/
[[email protected] db1]# ls
db.opt  innodb_t1.frm  innodb_t1.ibd  innodb_t2.frm  innodb_t2.ibd

二、索引

1、索引簡介

索引在MySQL中也叫做“鍵”,是存儲引擎用於快速找到記錄的一種數據結構。索引對於良好的性能非常關鍵,尤其是當表中的數據量越來越大時,索引對於性能的影響愈發重要。

索引優化應該是對查詢性能優化最有效的手段了。
索引能夠輕易將查詢性能提高好幾個數量級。
索引相當於字典的音序表,如果要查某個字,如果不使用音序表,則需要從幾百頁中逐頁去查。

索引特點:創建與維護索引會消耗很多時間與磁盤空間,但查詢速度大大提高!

2、索引語法

創建索引

--創建表時
--語法:
    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)
        );
---------------------------------

添加和刪除索引

---添加索引

    ---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 $$
create procedure autoinsert() 
BEGIN
declare i int default 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;--2.42s
-- 添加索引 
   create index index_id on Indexdb.t1(id);
-- 創建索引後
   select * from Indexdb.t1 where id=300000;--0.09s

技術分享

三、pymysql

pymysql是Python中操作MySQL的模塊,其使用方法和MySQLdb幾乎相同。

一、下載安裝:

pip3 install pymysql

二、使用

1、執行SQL

#!/usr/bin/env python
# -*- coding:utf-8 -*-
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

#!/usr/bin/env python
# -*- coding:utf-8 -*-
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、獲取查詢數據

#!/usr/bin/env python
# -*- coding:utf-8 -*-
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()

註:在fetch數據時按照順序進行,可以使用cursor.scroll(num,mode)來移動遊標位置,如:

  • cursor.scroll(1,mode=‘relative‘) # 相對當前位置移動
  • cursor.scroll(2,mode=‘absolute‘) # 相對絕對位置移動

4、fetch數據類型

  關於默認獲取的數據是元祖類型,如果想要或者字典類型的數據,即:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
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()

數據庫:數據庫引擎、索引、pymysql(四)