如何自動化完成SQL審核
很多游戲項目都是通過每周更新大版本來維持用戶的粘性和活躍度,而更新版本必然伴隨著數據庫的新建create、改表alter的SQL。
運維或者dba負責審核這類sql是否合理、高效,因為很多開發同事特別是經驗少的新人是不考慮sql性能、是否合乎MySQL的最佳實踐。
經常很多建表語句漏加索引或者加錯索引(不滿足最左匹配等情況),需要等到開服后數據庫負載過高引起告警才發現問題。
MySQL的配置中有一個日志是記錄沒有使用索引的sql,記錄進slow log日志中,不過實際使用過程中,的確存在著很多合理的不使用索引的情況,所以這個日志一般不打開。
為了避免人工審閱的重復勞動,所以運維可以通過寫程序、腳本來自動審核sql,而審核的條件一般如下:
1、表結構是否合法 //不合法當然不能通過
2、表名、列名長度超過 16 //主要跟我們自己的授權有關系
3、必須有 unsigned //業務最容易忘記添加,當然如果一定要負值,那么就走人工審核;
4、必須為 InnoDB //當然了,我已經忘記還有MyISAM了,統計日志表除外
5、int bigint(10) 不能小于 10 //大家見過int(1)的情況么?
6、varchar 長度小于 3000 // 這也算是一個人為規定,沒有任何意義
7、text 字段個數不能大于 3 //人為規定而已
8、主鍵必須為 int 類型 //不int,真的會死人
9、索引不能有重復 //見過key(id),key(id,uid)的情況嗎?
10、索引個數不能大于 5 個(包括主鍵) //人為定義而已
11、索引字段必須為 not null,并且有 default 值 //參照高性能那本書說的,其實不一定影響性能
12、SQL 是否使用到索引 //不能用到索引的SQL,真的很慘
13、SQL 中不能有 * //由于* 經常導致流量、O巨大,所以,也強制了
14、自增字段必須為 int 或者 bigint //見過自增用smallint的嗎?然后一下就溢出了
15、請不要使用MySQL的保留字(Reserved Words) //寫腳本,大家討厭符號么?
開發提交sql后,會直接調用后端審核程序,程序根據以上規則,進行審核,就極大的降低了運維、DBA的工作量。
當sql審核通過后,是否馬上執行?
根據以下情況判斷:
1、表小于10w行,小于10M空間大小,那么直接執行SQL;
2、如果不滿足1,并且滿足percona online-schema-change條件,那么通過osc工具,進行在線修改;
3、如果1、2都不行,走人工上線流程;
存儲過程與SQL語句是怎樣的
我的一位朋友說:他從臺灣知名技術作家李維先生的一本書中獲悉,如果用存儲過程封裝SQL語句,系統效率將有極大提升。
他做過實驗!!! --我相信朋友做過實驗,盡管非親眼所見。不過我估計他的實驗有問題,那樣的實驗不但蒙蔽了他,也蒙蔽了李維先生(如果他的著作中的內容沒有被誤會),甚至更多的人。
然而我必須拿出證據,方能使人信服。 后來遇到一個具體的問題:客戶端經常要向數據庫插入記錄。
在J2EE中,一個 Entity Bean Home 的 create 方法調用中,一般就沒用存儲過程。朋友立馬在觀點上持反對意見( 可能是因為他暫時有來得及否決J2EE ),認為要是J2EE能夠將“插入記錄”諸如此類動作改為對存儲過程的調用就好了。
我們因此再次發生爭論(我僅是反對朋友的看法,但也沒提出任何我自己的看法,因為要下一個結論是很不容易的)。最后我不得已而做了實驗,分別在 Oracle 10g 和 postgreSQL 8。
0。1 上。
實驗內容如下: A、建表腳本: create table ztest( fieldA integer primary key, fieldB varchar(128), fieldC varchar(128) ) B、客戶端請求 DBMS 執行的 insert SQL語句: insert into ztest values( ?1, ?2, ?3 ); -- ?1,?2,?3 將在運行時以合理的值替代之 C、客戶端調用的存儲過程(JDBC CallableStatement 調用): Oracle:(調用方式 call up_add(。 。
。),) create or replace procedure up_add( fieldA integer, fieldB varchar, fieldC varchar ) is begin insert into ztest values( fieldA, fieldB, fieldC); end; postgreSQL:(客戶端調用方式 select uf_add(。
。
) ) CREATE OR REPLACE FUNCTION uf_add (integer, varchar, varchar) RETURNS void AS' begin insert into ztest values($1,$2,$3); return; end; 'LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER; D、環境: postgreSQL:數據庫服務器與客戶端程序“都在本機”并“同時運行” Oracle: 獨立數據庫服務器(測試時始終有人在慢慢打字,應該對機器性能無影響) 測試: 通過不同方式( 即 請求DBMS執行SQL語句 和 調用DBMS邏輯等價的存儲過程)向測試表中連續加入 1024 記錄 經多次反復測試,得結果如下 postgreSQL: 兩種方式下,測試時間均為 21- 24 seconds 之間 (每個結果的測試環境一致) Oracle: 8次 SQL 執行請求分別用時(ms) 5422 4750 3875 3812 5672 3531 3484 3547 6次 存儲過程調用分別用時(ms) 4578 4500 6297 4219 4547 5734 (每個結果的測試環境一致)由此可知,存儲過程封裝簡單的 SQL 語句,效率相當,且可能更低。 但很多朋友的確得出結論:存儲過程的確比SQL快。
為什么?---- 因為他們測試時寫了一個不具實際意義,同時也與SQL語句的“一次客戶端調用”不具可比性的測試用存儲過程。Oracle PL/SQL 描述方式如下,該方法一次調用就可以向數據表添加 1024 條記錄,連網絡通訊都省了。
怪不得性能有“千倍差異”! create or replace procedure up_add( ) is declare n:integer; begin n := 0; while( n 它與客戶端一次提交單條 SQL 語句沒有可比性:當一次只需要向DBMS提交一條新記錄,要這個存儲過程干什么呢?。
怎樣查出前臺正在發出的sql語句
答:具體步驟如下: 軟件環境: 1、Windows 2000+ORACLE 8。
1。6 2、ORACLE安裝路徑為:C:\ORANT實現方法: 可以用以下語句: select user_name,sql_text from v$open_cursor where sid in (select sid from (select sid,serial from v$session where status=''''ACTIVE''''))子查詢: select sid,serial from v$session where status=''''ACTIVE''''查出的是不活動的session的sid。
SQL> desc v$open_cursor 名稱 空? 類型 ----------------------------- ------- SADDR RAW (4) SID NUMBER USER_NAME VARCHAR2(30) ADDRESS RAW (4) HASH_VALUE NUMBER SQL_TEXT VARCHAR2(60)。
SQL語句UPDATE指令是什么
我們有時候可能會需要修改表格中的資料。
在這個時候,我們就需要用到 UPDATE 指令。這個指令的語法是: UPDATE "表格名" SET "欄位1" = [新值] WHERE {條件} 最容易了解這個語法的方式是透過一個例子。
假設我們有以下的表格: Store_Information 表格 store_nameSalesDate Los Angeles$1500Jan-05-1999 San Diego$250Jan-07-1999 Los Angeles$300Jan-08-1999 Boston$700Jan-08-1999 我們發現說 Los Angeles 在 01/08/1999 的營業額實際上是 $500,而不是表格中所儲存的 $300,因此我們用以下的 SQL 來修改那一筆資料: UPDATE Store_Information SET Sales = 500 WHERE store_name = "Los Angeles" AND Date = "Jan-08-1999" 現在表格的內容變成: Store_Information 表格 store_nameSalesDate Los Angeles$1500Jan-05-1999 San Diego$250Jan-07-1999 Los Angeles$500Jan-08-1999 Boston$700Jan-08-1999 在這個例子中,只有一筆資料符合 WHERE 子句中的條件。 如果有多筆資料符合條件的話,每一筆符合條件的資料都會被修改的。
我們也可以同時修改好幾個欄位。這語法如下: UPDATE "表格" SET "欄位1" = [值1], "欄位2" = [值2] WHERE {條件}。