數據庫如何調優和寫sql的技巧

外部調優

1,使用連接池。 性能提升10倍

2, 阻止不必要的參數不讓傳進來

3,增加最大連接數,及時釋放連接

 

內部調優

1,改mysql進程(對MySQL服務器(也稱爲mysqld)進行調優。)

 對這個進程進行調優意味着適當地分配內存,並讓 mysqld 瞭解將會承受何種類型的負載。加快磁盤運行速度不如減少所需的磁盤訪問次數。

類似地,確保 MySQL 進程正確操作就意味着它花費在服務查詢上的時間要多於花費在處理後臺任務(如處理臨時磁盤表或打開和關閉文件)上的時間。對mysqld進行調優是本文的重點。

  最好的方法是確保查詢已經進行了優化。這意味着對錶應用了適當的索引,查詢是按照可以充分利用MySQL功能的方式來編寫的。儘管本文並沒有包含查詢調優方面的內容(很多著作中已經針對這個主題進行了探討),不過它會配置mysqld來報告可能需要進行調優的查詢。

  雖然已經爲這些任務指派了次序,但是仍然要注意硬件和mysqld的設置以利於適當地調優查詢。機器速度慢也就罷了,我曾經見過速度很快的機器在運行設計良好的查詢時由於負載過重而失敗,因爲mysqld被大量繁忙的工作所佔用而不能服務查詢。

參考了:https://kb.cnblogs.com/page/96934/

2、寫SQL 技巧

高效查重、不重:

oracle : 因爲使用了ROWID

select a.*
from T_I9V_B_BILL_DISCOUNT a where a.ROWID = (select min(x.ROWID)
from T_I9V_B_BILL_DISCOUNT x where x.PROD_TYP_ID = a.PROD_TYP_ID and x.DUBIL_ORDR_NUM = a.DUBIL_ORDR_NUM);

mysql :  (menu_uuid  爲主鍵)

SELECT
    * 
FROM
    pub_menu AS ta 
WHERE
    ta.menu_uuid <> ( SELECT max( tb.menu_uuid ) FROM pub_menu AS tb WHERE ta.menu_type = tb.menu_type );

 

3,索引優化:

1   索引佔用磁盤或者內存空間 減慢了插入更新操作的速度

2  前綴索引的作用是可以減少索引的大小到原來的60%的. alter table user add index sch_pre3(school(3))

3   where 後兩個條件,都加上單索引  ,查詢時只用到一個

4   創建聯合索引的語法:alter table user add index school_age(school,age).      
    使用聯合索引的時候,有一個非常重要的因素就是所有的索引列只可以進行最左前綴匹配,例如上面的school_age聯合索引,當僅使用age作爲查詢條件的時候是不能使用的
    此外,最左前綴索引只能使用一個範圍查詢 select * from user where school > a and age > 12中,僅school可以命中索引 
     
5 、一個表上只能有一個聚簇索引. 一個數據表中的數據總得有且只有一種排序方式來存儲在磁盤上,因此這是必須的.  主鍵> 一個唯一的非空索引> 生成一個隱式的主鍵

6  毫無作用的  :    在主鍵上再建立一個普通索引
                    在有聯合索引school_age的情況下,再建立一個school的獨立索引    

4 模板語句

 mysql :

使用show index from table_name來查看某個表上的索引
 使用show create table table_name來查看建表語句,其中包含創建索引的語句   

oracle : 

查看建表語句:

select dbms_metadata.get_ddl('TABLE','I9_BLACKLIST','POC_I9_BASE') from dual;       

查數據和索引大小

mysql:
 // 查看當前MySQL服務器所有索引的大小(以MB爲單位,默認是字節)
   SELECT CONCAT(ROUND(SUM(index_length)/(1024*1024), 2), ' MB') AS 'Total Index Size' FROM TABLES
  // 查看某一個庫的所有大小
   SELECT CONCAT(ROUND(SUM(index_length)/(1024*1024), 2), ' MB') AS 'Total Index Size' FROM TABLES  WHERE table_schema = 'XXX';
  // 查看某一個表的索引大小
   SELECT CONCAT(ROUND(SUM(index_length)/(1024*1024), 2), ' MB') AS 'Total Index Size' FROM TABLES  WHERE table_schema = 'yyyy' and table_name = "xxxxx";  
  // 彙總查看一個庫中的數據大小及索引大小
   SELECT CONCAT(table_schema,'.',table_name) AS 'Table Name', CONCAT(ROUND(table_rows/1000000,4),'M') AS 'Number of Rows', CONCAT(ROUND(data_length/(1024*1024*1024),4),'G') AS 'Data Size', CONCAT(ROUND(index_length/(1024*1024*1024),4),'G') AS 'Index Size', CONCAT(ROUND((data_length+index_length)/(1024*1024*1024),4),'G') AS'Total'FROM information_schema.TABLES WHERE table_schema LIKE 'xxxxx';
 

 

 

參考 : https://blog.csdn.net/weixin_44104367/article/details/101594591

             https://blog.csdn.net/wanghao112956/article/details/91040590

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章