優化MYSQL資料庫的方法(口頭總結)

2021-07-02 18:06:46 字數 4358 閱讀 8655

mysql優化方法 

建立的表要滿足3nf(3正規化), 即要滿足3個規範,最高端6nf.

1).盡可能使用更小的整數型別.(mediumint就比int更合適).

2).盡可能的定義欄位為not  null,除非這個字段需要null.

3).如果沒有用到變長字段的話比如varchar,那就採用固定大小的紀錄格式比如char.

4).表的主索引應該盡可能的短.這樣的話每條紀錄都有名字標誌且更高效

建立適當索引[主鍵索引|唯一索引|普通索引|全文索引 fulltext|空間索引]

優化程式中sql語句(定位慢查詢)

1、選取最適用的字段屬性

2、使用連線(join)來代替子查詢(sub-queries)

3、使用聯合(union)來代替手動建立的臨時表 

1).盡量使用長連線.

3).如果兩個關聯表要做比較話,做比較的字段必須型別和長度都一致.

4).limit語句盡量要跟order   by或者   distinct.這樣可以避免做一次full   table   scan.

建立適當的儲存過程,函式,檢視,觸發器

讀寫分離

分表技術[水平分表,垂直分表, 邏輯]和分割槽技術[把海量資料分配到不同磁碟分割槽]

my.ini 配置優化

5).如果想要清空表的所有紀錄,建議用truncate   table   tablename而不是delete   from   tablename.

6).能使用store   procedure   或者   user   function的時候.

7).在一條insert語句中採用多重紀錄插入格式.而且使用load   data   infile來匯入大量資料,這比單純的indert快好多.

8).經常optimize   table   來整理碎片.

硬體公升級

(1).資料庫設計方面,這是dba和architect的責任,設計結構良好的資料庫,必要的時候,去正規化(英文是這個:denormalize,中文翻譯成啥我不知道),允許部分資料冗餘,避免join操作,以提高查詢效率

(2).系統架構設計方面,表雜湊,把海量資料雜湊到幾個不同的表裡面.快慢表,快表只留最新資料,慢表是歷史存檔.集群,主伺服器read & write,從伺服器read only,或者n臺伺服器,各機器互為master

(3).(1)和(2)超越php programmer的要求了,會更好,不會沒關係.檢查有沒有少加索引

(4).寫高效的sql語句,看看有沒有寫低效的sql語句,比如生成笛卡爾積的全連線啊,大量的group by和order by,沒有limit等等.必要的時候,把資料庫邏輯封裝到dbms端的儲存過程裡面.快取查詢結果,explain每乙個sql語句

只傳送必須的sql語句,比如修改文章的時候,如果使用者只修改了標題,那就update ... set title = ? where article_id = ?不要set content = ?(大文字)

(6).必要的時候用不同的儲存引擎.比如innodb可以減少死鎖.heap可以提高乙個數量級的查詢速度 

優化mysql資料庫的方法。

答:1、選取最適用的字段屬性,盡可能減少定義字段長度,盡量把字段設定not null,例如'省份,性別',最好設定為enum

2、使用連線(join)來代替子查詢:

a.刪除沒有任何訂單客戶:delete from customerinfo where customerid not in(select customerid from orderinfo)

b.提取所有沒有訂單客戶:select from customerinfo where customerid not in(select customerid from orderinfo)

c.提高b的速度優化:select from customerinfo left join orderid customerinfo.customerid=orderinfo.customerid

where orderinfo.customerid is null

3、使用聯合(union)來代替手動建立的臨時表

a.建立臨時表:select name from `nametest` union select username from `nametest2`

4、事務處理:

a.保證資料完整性,例如新增和修改同時,兩者成立則都執行,一者失敗都失敗

mysql_query("begin");

mysql_query("insert into customerinfo (name) values ('$name1')";

mysql_query("select * from `orderinfo` where customerid=".$id");

mysql_query("commit");

5、鎖定表,優化事務處理:

a.我們用乙個 select 語句取出初始資料,通過一些計算,用 update 語句將新值更新到表中。

包含有 write 關鍵字的 lock table 語句可以保證在 unlock tables 命令被執行之前,

不會有其它的訪問來對 inventory 進行插入、更新或者刪除的操作

mysql_query("lock table customerinfo read, orderinfo write");

mysql_query("select customerid from `customerinfo` where id=".$id);

mysql_query("update `orderinfo` set ordertitle='$title' where customerid=".$id);

mysql_query("unlock tables");

6、使用外來鍵,優化鎖定表

a.把customerinfo裡的customerid對映到orderinfo裡的customerid,

任何一條沒有合法的customerid的記錄不會寫到orderinfo裡

create table customerinfo

(customerid int not null,

primary key(customerid)  

)type = innodb;

create table orderinfo

(orderid int not null,

customerid int not null,

primary key(customerid,orderid),

foreign key (customerid) references customerinfo

(customerid) on delete cascade   

)type = innodb;

注意:'on delete cascade',該引數保證當customerinfo表中的一條記錄刪除的話同時也會刪除order

表中的該使用者的所有記錄,注意使用外來鍵要定義事務安全型別為innodb;

7、建立索引:

a.格式:

(普通索引)->

建立:create index 《索引名》 on tablename (索引字段)

修改:alter table tablename add index [索引名] (索引字段)

創表指定索引:create table tablename([...],index[索引名](索引字段)) 

(唯一索引)->

建立:create unique 《索引名》 on tablename (索引字段)

修改:alter table tablename add unique [索引名] (索引字段)

創表指定索引:create table tablename([...],unique[索引名](索引字段)) 

(主鍵)->

它是唯一索引,一般在建立表是建立,格式為:

creata table tablename ([...],primary key[索引字段])

8、優化查詢語句

a.最好在相同字段進行比較操作,在建立好的索引欄位上儘量減少函式操作

例子1:

select * from order where year(orderdate)<2008;(慢)

select * from order where orderdate<"2008-01-01";(快)

例子2:

select * from order where addtime/7<24;(慢)

select * from order where addtime<24*7;(快)

例子3:

select * from order where title like "%good%";

select * from order where title>="good" and name<"good";

優化MYSQL資料庫的方法

1 資料庫設計方面,這是dba和architect的責任,設計結構良好的資料庫,必要的時候,去正規化 英文是這個 denormalize,中文翻譯成啥我不知道 允許部分資料冗餘,避免join操作,以提高查詢效率 2 系統架構設計方面,表雜湊,把海量資料雜湊到幾個不同的表裡面.快慢表,快表只留最新資料...

優化MYSQL資料庫的方法

1 選取最適用的字段屬性,盡可能減少定義字段長度,盡量把字段設定not null,例如 省份,性別 最好設定為enum 2 使用連線 join 來代替子查詢 a.刪除沒有任何訂單客戶 delete from customerinfo where customerid notin select cus...

優化MYSQL資料庫的方法

1 建立索引 a 普通索引 建立 create index 索引名 on tablename 索引字段 修改 alter table tablename add index 索引名 索引字段 創表指定索引 create table tablename index 索引名 索引字段 b 唯一索引 建立...