1. 程式人生 > >mysql基礎+主從復制、讀寫分離、高可用原理

mysql基礎+主從復制、讀寫分離、高可用原理

mysql基礎

1)創建數據庫 create database wpj1105;

2)創建數據庫 create database wpj1105;

3)判斷是否存在庫 : drop database if exists wpj1105;

4)使用該數據庫 use wpj1105; 5)#顯示數據庫中的表 show tables;

6)創建表create table student( id int auto_increment primary key, name varchar(50) not null, sex varchar(20), date varchar(

50), content varchar(100) )default charset=utf8;

7)查找表 select xxxxx from student;

8)顯示表的結構:desc student;

9)添加數據 insert into student values(null,'aa','男','1988-10-2','......');

10)修改數據表的編碼方式:ALTER TABLE `test` DEFAULT CHARACTER SET utf8

11)ALTER TABLE `test` CHANGE `name` `name` VARCHAR(36) CHARACTER SET utf8 NOT NULL; 該命令用於將表test中name字段的編碼方式改為utf8

12)修改某一條數據update student set sex='男' where id=4;

13)delete from student where id=5;

14刪除數據delete from student where id=5; 15)# and 且select * from student where date>'1988-1-2' and date<'1988-12-1'; 16)# or 或 select * from student where date<'1988-11-2' or date>'1988-12-1'; 17)#between select * from student where date between '1988-1-2'and'1988-12-1';

18)修改數據update c set age=66 where id=2;update c set name='花花',age=21,sex='女' where id=2

技術分享圖片

視圖:視圖就是一條SELECT語句執行後返回的結果集。所以我們在創建視圖的時候,主要的工作就落在創建這條SQL查詢語句上。

使用場合:權限控制的時候,不希望用戶訪問表中某些含敏感信息的列,比如salary...關鍵信息來源於多個復雜關聯表,可以創建視圖提取我們需要的信息,簡化操作;

比如有三張表,表一:學生姓名,學號,住址,表二:科目id,科目名稱,對應課程,表三:學生id,對應的科目id。此時如果我要找到一個學生的信息:

SELECT
    `uc`.`id` AS `id`,
    `u`.`name` AS `username`,
    `c`.`name` AS `coursename`FROM
    `user` `u`LEFT JOIN `user_course` `uc` ON ((`u`.`id` = `uc`.`userid`))LEFT JOIN `course` `c` ON ((`uc`.`courseid` = `c`.`id`))WHERE
    u.`name` = '小張'

如果創建視圖:

 ALGORITHM  `view_user_course`   `user_course` `uc`  ((`u`.`id`   `course` `c`  ((`uc`.`courseid`

此時如果需要查詢語句:則

SELECT
    vuc.username,
    vuc.coursenameFROM
    view_user_course vucWHERE
     vuc.username = '小張'

ALGORITHM=UNDEFINED:指定視圖的處理算法;

DEFINER=`root`@`localhost`:指定視圖創建者;

SQL SECURITY DEFINER:指定視圖查詢數據時的安全驗證方式;

即可完成,要說的是,視圖是對若幹張基本表的引用,一張虛表,查詢語句執行的結果,不存儲具體的數據(基本表數據發生了改變,視圖也會跟著改變);但是它確實會存在於數據庫之中,所以對於表和視圖在數據庫中如果沒有很好的區分,

實現視圖的方式有兩種,分別為合並算法和臨時表算法,合並算法是指查詢視圖時將視圖定義的sql合並到查詢sql中,比如create view v1 as select * from user where sex=m;當我們要查詢視圖時,mysql會將select id,name from v1;合並成select id,name from user where sex=m……;臨時表算法是先將視圖查出來的數據保存到一個臨時表中,查詢的時候查這個臨時表。不管是合並算法和臨時表算法都會帶來額外的開銷,;且如果使用臨時表後會使mysql的優化變得很困難,比如索引。而且視圖還引入了一些其他的問題,使得其背後的邏輯非常復雜。所以在現在很少用到視圖了。


索引:首先聲明一下索引是針對於一個數據表中的列的,分為兩種:單列索引和組合索引。它的作用就是用於快速找出在某個列中有一特定值的行。

Mysql常見索引有:主鍵索引、唯一索引、普通索引、全文索引、組合索引

PRIMARY KEY(主鍵索引) ALTER TABLE `table_name` ADD PRIMARY KEY ( `col` )

UNIQUE(唯一索引) ALTER TABLE `table_name` ADD UNIQUE (`col`)

INDEX(普通索引) ALTER TABLE `table_name` ADD INDEX index_name (`col`)

FULLTEXT(全文索引) ALTER TABLE `table_name` ADD FULLTEXT ( `col` )
組合索引 ALTER TABLE `table_name` ADD INDEX index_name (`col1`, `col2`, `col3` )

創建索引:
1.經常需要搜索的列上,可以加快搜索的速度;
2.作為主鍵的列上,強制該列的唯一性和組織表中數據的排列結構;
3.經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;
4.經常需要根據範圍進行搜索的列上創建索引,因為索引已經排序,其指定的範圍是連續的;
5.經常需要排序的列上創 建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
6.經常使用在WHERE子句中的列上面創建索引,加快條件的判斷速度。

索引的優缺點
優點:
1.通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。
2.可以大大加快數據的檢索速度,這也是創建索引的最主要的原因。
3.可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
4.在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。
5.通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。

缺點:
1.創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加。
2.索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚集索引那麽需要的空間就會更大。
3.當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。

因為索引非常占內存,所以索引也需要謹慎添加,那些字段需要索引。

引擎:

mysql主要有兩種引擎:innodb和myiasm。

兩種存儲引擎的大致區別表現在:
1)InnoDB支持事務,MyISAM不支持,這一點是非常之重要。事務是一種高級的處理方式,如在一些列增刪改中只要哪個出錯還可以回滾還原,而MyISAM就不可以了。
2)MyISAM適合查詢以及插入為主的應用,InnoDB適合頻繁修改以及涉及到安全性較高的應用
3)InnoDB支持外鍵,MyISAM不支持
4)從MySQL5.5.5以後,InnoDB是默認引擎
5)InnoDB不支持FULLTEXT類型的索引
6)InnoDB 中不保存表的行數,如select count(*) from table時,InnoDB需要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。註意的是,當count(*)語句包含 where條件時MyISAM也需要掃描整個表
7)對於自增長的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中可以和其他字段一起建立聯合索引
8)清空整個表時,InnoDB是一行一行的刪除,效率非常慢。MyISAM則會重建表
9)InnoDB支持行鎖(某些情況下還是鎖整表,如 update table set a=1 where user like '%lee%'










mysql基礎+主從復制、讀寫分離、高可用原理