【python之路】数据库2
一、數據庫存儲引擎
1.什么是存儲引擎
mysql中建立的庫===>文件夾
庫中建立的表===>文件
現實生活中我們用來存儲數據的文件應該有不同的類型:比如存文本用txt類型,存表格用excel,存圖片用png等
數據庫中的表也應該有不同的類型,表的類型不同,會對應mysql不同的存取機制,表類型又稱為存儲引擎。
存儲引擎說白了就是如何存儲數據、如何為存儲的數據建立索引和如何更新、查詢數據等技術的實現方法。因為在關系數據庫中數據的存儲是以表的形式存儲的,所以存儲引擎也可以稱為表類型(即存儲和操作此表的類型)
在Oracle 和SQL Server等數據庫中只有一種存儲引擎,所有數據存儲管理機制都是一樣的。而MySql數據庫提供了多種存儲引擎。用戶可以根據不同的需求為數據表選擇不同的存儲引擎,用戶也可以根據自己的需要編寫自己的存儲引擎
二、mysql支持的存儲引擎
MariaDB [(none)]> show engines\G #查看所有支持的存儲引擎 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 pymysqlconn = 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.lastrowid3.獲取查詢數據
import pymysqlconn = 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 pymysqlconn = 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()?
轉載于:https://www.cnblogs.com/78pikaqiu/p/7251476.html
總結
以上是生活随笔為你收集整理的【python之路】数据库2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用算法原理
- 下一篇: $python数据分析基础——初识num