1. 存儲引擎(處理表的處理器)
1. 基本操做
1. 查看全部存儲引擎
mysql>show engines;
2. 查看已有表的存儲引擎
mysql>show create table 表名;
3. 建立表指定
create table 表名(
...)engine=innodb,character set utf8;
4. 已有表
alter table 表名 engine=innodb;python
2. 鎖(MySQL會自動加鎖)
1. 目的:解決客戶端併發訪問的衝突問題
2. 鎖分類
1. 讀鎖(共享鎖)
select:加讀鎖以後別人不能更改表記錄,但能夠進行查詢
2. 寫鎖(互斥鎖、排他鎖)
insert、delete、update:加寫鎖以後別人不能查、不能改
3. 鎖粒度
1. 表級鎖:myisam
2. 行級鎖:innodbmysql
3. 經常使用存儲引擎特色
1. InnoDB特色
/var/lib/mysql/庫名
1. 共享表空間
表名.frm: 表結構和索引文件
表名.ibd: 表記錄
2. 支持行級鎖
3. 支持外鍵、事務操做
2. MyISAM特色
1. 獨享表空間
表名.frm : 表結構
表名.myd : 表記錄 mydata
表名.myi: 索引文件 myindex
2. 支持表級鎖sql
4. 如何決定使用哪一個存儲引擎
1. 執行查詢操做多的表用 MyISAM(使用InnoDB浪費資源)
2. 執行寫操做多的表用 InnoDB數據庫
1. 選擇合適的存儲引擎
1. 讀操做多: MyISAM
2. 寫操做多:InnoDB
2. 建立索引
在select、where、order by常涉及到的字段創建索引
3. SQL語句的優化
1. where子句中不使用 !=,不然放棄索引全表掃描
2. 儘可能避免NULL值判斷,不然放棄索引全表掃描
優化前:
select number from t1 where number is null;
優化後:
在number列上設置默認值0,確保number列無NULL值
select nuumber from t1 where number=0;
3. 儘可能避免 or 鏈接條件,不然放棄索引全表掃描
優化前:
select id from t1 where id=10 or id=20;
優化後:
select id from t1 where id=10
union all
select id from t1 where id=20
union all
select id from t1 where id=30;
4. 模糊查詢儘可能避免使用前置%,不然全表掃描
select name from t1 where name like "%c%";
5. 儘可能避免使用in 和 not in,不然全表掃描
select id from t1 where id in(1,2,3,4);
select id from t1 where id between 1 and 4;
6. 儘可能避免使用 select * ...;用具體字段代替*,不要返回用不到的任何字段併發
1. 定義:一件事從開始發生到結束的整個過程
2. 做用:確保數據一致性
3. 事務和事務回滾應用
1. MySQL中SQL命令會自動commit到數據庫
show variables like "autocommit";
2. 事務應用
1. 開啓事務
mysql > begin
mysql > ... 一條或多條SQL語句
## 此時autocommit被禁用
2. 終止事務
mysql >commit; | rollback;app
3. 案例
1. 背景
你:建行卡
你朋友:工商卡
你在建行自動取款機給你朋友的工商卡轉帳5000元fetch
2. 建表
表1. CCB
create table CCB(
name varchar(15),
money decimal(20,2));
insert into CCB values("隻手遮天",10000);
表2. ICBC
create table ICBC(
name varchar(15),
money decimal(20,2));
insert into ICBC values("隨心所欲",1000)優化
3. 開始轉帳
begin;
update CCB set money=money-5000 where name="隻手遮天";
update ICBC set 宕機了;
rollback;
begin;
update CCB set money=money-5000 where name="隻手遮天";
update ICBC set money=money+5000 where name="隨心所欲";編碼
1. 交互類型
1.python3
模塊名: pymysql
安裝:
在線:sudo pip3 install pymysql
離線:pymysql-0.7.11.tar.gz
$ tar -zxvf pymysql-0.7.11.tar.gz
$ cd pymysql-0.7.11
$ sudo python3 setup.py installspa
2. python2
模塊名:MySQLdb
安裝:sudo pip install mysql-python
sqlalchemy安裝:
在線:sudo pip3 install sqlalchemy
離線:
$ tar -zxvf SQLAlchemy-1.2.10.tar.gz
$ cd SQLAlchemy-1.2.10
$ sudo python3 setup.py install
驗證:
$ python3
>>> import sqlalchemy
2. pymysql使用流程
1. 創建數據庫鏈接(pymysql.connect(...))
2. 建立遊標對象(c = db.cursor())
3. 遊標方法:c.execute("insert ....")
4. 提交到數據庫:db.commit()
5. 關閉遊標對象:c.close()
6. 斷開數據庫鏈接:db.close()
3. connect對象
1. db= pymysql.connect(參數列表)
1. host: 主機地址,本地 localhost
2. port: 端口號,默認3306
3. user: 用戶名
4. password: 密碼
5. database: 庫
6. charset: 編碼方式,推薦使用 utf8
2. 數據庫鏈接對象(db)的方法
1. db.close() 關閉鏈接
2. db.commit() 提交到數據庫執行
3. db.rollback() 回滾
4. cur = db.cursor() 返回遊標對象,用於執行具體SQL命令
3. 遊標對象(cur) 的方法
1. cur.execute(SQL命令) 執行SQL命令
2. cur.close() 關閉遊標對象
3. cur.fetchone() 獲取查詢結果集的第一條數據
(1, 100001,'河北省')
4. cur.fetchmany(n) 獲取n條
((記錄1),(記錄2))
5. cut.fetchall() 獲取全部記錄
6. orm(Object Relation Mapping 對象關係映射)
1. 定義
把對象模型映射到MySQL數據庫中
2. sqlalchemy安裝:
在線:sudo pip3 install sqlalchemy
離線:
$ tar -zxvf SQLAlchemy-1.2.10.tar.gz
$ cd SQLAlchemy-1.2.10
$ sudo python3 setup.py install
驗證:
$ python3
>>> import sqlalchemy
3. 示例 class User(Base): __tablename__ = "t1" # 聲明要建立的表名 id = Column(Integer,primary_key=True) name = Column(String(20)) 解釋: 一個類User --> 一張表 t1 表中有兩個字段:id 和 name