1. 程式人生 > >資料庫引擎,資料庫索引,MySQL索引的優化,分表分庫

資料庫引擎,資料庫索引,MySQL索引的優化,分表分庫

資料庫引擎

InnoDB


mysql中儲存資料的地方在安裝檔案的ibdata1中  ,如果資料過大後會再次生成一個 ibdata_xxxx 檔案出來

MyISAM


儲存資料是在安裝檔案的中data資料夾下的以資料庫名稱命名的資料夾下,frm 檔案字尾結尾

InnoDB與MyISAM的區別
  InnoDB和MyISAM是許多人在使用MySQL時最常用的兩個表型別,這兩個表型別各有優劣,視具體應用而定。基本的差別為:MyISAM型別不 支援事務處理等高階處理,而InnoDB型別支援。MyISAM型別的表強調的是效能,其執行數度比InnoDB型別更快,但是不提供事務支援,而 InnoDB提供事務支援已經外部鍵等高階資料庫功能

資料庫索引

建立索引


會在索引欄位中每條資料加上一個標示,

資料庫表字段建立索引會佔用空間, 

建立索引建立到select經常查詢到的欄位上

MySQL索引的優化

上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對錶進行 INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要儲存資料還要更新索引。建立索引會佔用磁碟空間。一般情 況這個問題不太嚴重,但如果你在一個大表上建立了多種組合索引,索引檔案的會膨脹很快。索引只是提高效率的一個操作,如果你的MySQL有大資料量的表,就需要花時間研究建立索引,或優化查詢語句。下面是一些總結以及收藏的MySQL索引的注意事項和優化方法。


分表分庫 
    1.分表

     在以往的開發專案的過程中,如果一張表資料量非常大,已經在操作這表的時候,執行效率已經不符合使用者的體驗度了,我們就會針對這張表進行分表的操作,分表之後,大大提高了資料庫效率

     2.分庫

     分庫我們通常會根據我們這個專案的版本或者是時間達到某個點進行分庫,比如說,我們在做訂單的模組的時候,我們會在每一年的結束的時候來進行分庫,假如使用者去查詢2015的消費情況的時候。我們回去在2015的這個庫裡去查詢,如果實在今年我們會在2016庫裡去查詢

--執行順序

select t.*,t.lookename aa

from looker t

where aa>='a'

order by aa

--語法錯誤,where 後面的aa不認識,

原因,先執行where,後執行select  

from --》where--》group by   having --》 select --》 order by 

--怎麼測試,命一個別名,看他認不認識

--效率問題,我們可以使用sql的執行計劃,看出每步的用時


--sql的連結查詢

select * from emp a,dept b   --交叉查詢,結果集就是一個笛卡爾集,左表*右表,另一種寫法  a cross join b。交叉查詢沒有實際使用意義

where a.deptno = b.deptno    --內連線查詢,這就是使用比較多的,-- a [inner] join b on a.xx=b.xx

--number[(p,[s])]  number(20,5) []表示引數可選

--左連線查詢   a left join b on -----,    select * from emp a,dept b where a.deptno = b.deptno(+),也是左連線查詢的一種寫法,左連線+寫在右邊

--左連線也是使用最大一種,其次就是內連線

--全外連線查詢  full join,不可以兩邊都+號,絕對不可以

--空值,濾空

--1、有空值參與的運算結果都為空

--2、空值不等於空值

--3、可以使用 ==null是嗎?不是,絕對不是, 首先sql中,就不能使用==,這是java中語法,sql中使用=,和java中的==一樣,sql中的賦值用 :=,其次,sql中的判斷為空用is [not] null

--4、空值在排序的時候,比數值大的

--5、可以使用nulls last 和nulls first來控制空值的前後

select * from emp t  order by comm desc nulls last

--6、我們可以使用nvl函式來濾空  nvl(欄位,當欄位為空時候的預設值),不為空是原值

--7、可以使用decode函式來濾空(T-sql),非標準sql,只有oracle有

--8、case when then 來濾空,這個是一個標準sql,在mysql中可以執行

select a.*,

        case age when 2 then '兒童'

                         when 3 then '成年'

                        else '老年'

        end  狀態

from looker a


--能用>=或者<=的地方就儘量不要使用 ><,能帶=的就儘量帶上=號,效率高
讀寫分離

   在以往的開發專案的過程中我們威力減輕資料庫壓力我們會在資料庫中進行讀寫分離的操作

1.  首先我們在生成資料來源的時候會生成兩個資料來源,兩個資料來源的所有欄位和主鍵都一樣,唯一不同的兩張表的資料庫引擎不一樣,一張為InnoDB,一張為 MyISAM。
2.  因為引擎為INNODB的資料來源的引擎支援事務的處理等高階處理,我們可以讓其提供寫的功能
3.  因為引擎為MyISAM的資料來源強調的是效能,其執行數度比InnoDB型別更快,但是不提供事務支援 ,我們可以讓其提供讀的功能   

1. 資料庫做叢集搭建,在spring配置檔案中搭建兩個資料來源
2. 配置兩個 sessionfacotry 去分別 ref 兩個sessionfactory  一個 叫 read,一個叫 write
3. 兩個hibernatetemplate引用 read和write,這樣實現了基本的讀寫分離
4. 我們做了叢集,兩個資料庫伺服器中的資料是一致的,我們做了兩個資料來源這樣使用者使用不同的資料庫引擎一個讀一個寫