A. 如何進行sql性能優化
這里分享下mysql優化的幾種方法。
1、首先在打開的軟體中,需要分別為每一個表創建 InnoDB FILE的文件。
B. 搜集SQL常用的操作語句
結構化查詢語言(Structured Query Language)簡稱SQL(發音:/ˈes kjuː ˈel/ "S-Q-L"),是一種特殊目的的編程語言,是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系資料庫系統;同時也是資料庫腳本文件的擴展名。
一、插入(復制)表數據
1、INSERT INTO 語句:
(1)插入新的一行數
[sql] view plain ;
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing');
(2)在指定的列中插入數據
[sql] view plain ;
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees');
2、SQL SELECT INTO 語句可用於創建表的備份復件
(1)在建表時復制所有數據
[sql] view plain ;
create table userinfo_new as select * from userinfo;
(2)在建表時復制部分數據
[sql] view plain ;
create table userinfo_new1 as select id,username from userinfo;
(3)在添加時復制所有數據
[sql] view plain ;
insert into userinfo_new select * from userinfo;
(4)在添加時復制部分數據
[sql] view plain ;
insert into userinfo_new(id,username) select id,username from userinfo;
二、修改表數據
Update 語句
(1)無條件更新
[sql] view plain ;
update userinfo set userpwd='111',email='[email protected]';
(2)有條件更新
[sql] view plain ;
update userinfo set userpwd='123456' where username='xxx';
三、刪除表數據
1、DELETE 語句
(1)無條件刪除
[sql]view plain;
daletefromuserinfo;
(2)有條件刪除
[sql]view plain;
='yyy';
四、查詢表數據
1、SELECT 語句:
(1)查詢所有欄位
[sql] view plain ;
select * from users;
(2)查詢指定欄位
[sql] view plain ;
select username,salary from users;
2、SELECT DISTINCT 語句
從 Company" 列中僅選取唯一不同的值,需要使用 SELECT DISTINCT 語句:
[sql] view plain ;
SELECT DISTINCT Company FROM Orders;
C. SQL優化萬能公式:5 大步驟 + 10 個案例
在應用開發的早期,數據量少,開發人員開發功能時更重視功能上的實現,隨著生產數據的增長,很多SQL語句開始暴露出性能問題,對生產的影響也越來越大,有時可能這些有問題的SQL就是整個系統性能的瓶頸。
1、通過慢查日誌等定位那些執行效率較低的SQL語句
2、explain 分析SQL的執行計劃
type由上至下,效率越來越高
Extra
3、show profile 分析
了解SQL執行的線程的狀態及消耗的時間。默認是關閉的,開啟語句「set profiling = 1;」
4、trace
trace分析優化器如何選擇執行計劃,通過trace文件能夠進一步了解為什麼優惠券選擇A執行計劃而不選擇B執行計劃。
5、確定問題並採用相應的措施
案例1、最左匹配
索引
SQL語句
查詢匹配從左往右匹配,要使用order_no走索引,必須查詢條件攜帶shop_id或者索引( shop_id , order_no )調換前後順序
案例2、隱式轉換
索引
SQL語句
隱式轉換相當於在索引上做運算,會讓索引失效。mobile是字元類型,使用了數字,應該使用字元串匹配,否則MySQL會用到隱式替換,導致索引失效。
案例3、大分頁
索引
SQL語句
對於大分頁的場景,可以優先讓產品優化需求,如果沒有優化的,有如下兩種優化方式, 一種是把上一次的最後一條數據,也即上面的c傳過來,然後做「c < xxx」處理,但是這種一般需要改介面協議,並不一定可行。另一種是採用延遲關聯的方式進行處理,減少SQL回表,但是要記得索引需要完全覆蓋才有效果,SQL改動如下
案例4、in + order by
索引
SQL語句
in查詢在MySQL底層是通過n*m的方式去搜索,類似union,但是效率比union高。in查詢在進行cost代價計算時(代價 = 元組數 * IO平均值),是通過將in包含的數值,一條條去查詢獲取元組數的,因此這個計算過程會比較的慢,所以MySQL設置了個臨界值(eq_range_index_pe_limit),5.6之後超過這個臨界值後該列的cost就不參與計算了。因此會導致執行計劃選擇不準確。默認是200,即in條件超過了200個數據,會導致in的代價計算存在問題,可能會導致Mysql選擇的索引不準確。
處理方式,可以( order_status , created_at )互換前後順序,並且調整SQL為延遲關聯。
案例5、范圍查詢阻斷,後續欄位不能走索引
索引
SQL語句
范圍查詢還有「IN、between」
案例6、不等於、不包含不能用到索引的快速搜索。(可以用到ICP)
在索引上,避免使用NOT、!=、>、!、NOT EXISTS、NOT IN、NOT LIKE等
案例7、優化器選擇不使用索引的情況
如果要求訪問的數據量很小,則優化器還是會選擇輔助索引,但是當訪問的數據占整個表中數據的蠻大一部分時(一般是20%左右),優化器會選擇通過聚集索引來查找數據。
查詢出所有未支付的訂單,一般這種訂單是很少的,即使建了索引,也沒法使用索引。
案例8、復雜查詢
如果是統計某些數據,可能改用數倉進行解決;如果是業務上就有那麼復雜的查詢,可能就不建議繼續走SQL了,而是採用其他的方式進行解決,比如使用ES等進行解決。
案例9、asc和desc混用
desc 和asc混用時會導致索引失效
案例10、大數據
對於推送業務的數據存儲,可能數據量會很大,如果在方案的選擇上,最終選擇存儲在MySQL上,並且做7天等有效期的保存。那麼需要注意,頻繁的清理數據,會照成數據碎片,需要聯系DBA進行數據碎片處理。
D. sql怎麼讀
SQL是Structured Query Language的簡稱,英式讀法為[ˈstrʌktʃəd ˈkwɪəri ˈlæŋɡwɪdʒ]。
結構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的編程語言,是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系資料庫系統。
SQL資料庫的數據體系結構基本上是三級結構,但使用術語與傳統關系模型術語不同。在SQL中,關系模式稱為「基本表」(base table);存儲模式(內模式)稱為「存儲文件」(stored file);子模式稱為「視圖」(view);元組稱為「行」(row);屬性稱為「列」(column)。
SQL包括了所有對資料庫的操作,主要是由4個部分組成:
1、數據定義:又稱為「DDL語言」,定義資料庫的邏輯結構,包括定義資料庫、基本表、視圖和索引4部分。
2、數據操縱:又稱為「DML語言」,包括插入、刪除和更新三種操作。
3、數據查詢:又稱為「DQL語言」,包括數據查詢操作。
4、數據控制:又稱為「DCL語言」,對用戶訪問數據的控制有基本表和視圖的授權及回收。
5、事務控制:又稱為「TCL語言」,包括事務的提交與回滾。
6、嵌入式SQL語言的使用規定:規定SQL語句在宿主語言的程序中使用的規則。
E. SQL是什麼什麼化語言
SQL語言簡介:
結構化查詢語言(Structured Query Language)簡稱SQL(發音:/ˈes kjuː ˈel/ "S-Q-L"),是一種特殊目的的編程語言,是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系資料庫系統;同時也是資料庫腳本文件的擴展名。
SQL語句:
主要是由sql 關鍵字加sql對象的名稱組合而成。
常見的sql操作語句有:
insert(增) update(改) delete(刪除) select(查) where (條件限定關鍵字)
/*例:下文將創建一個基本的sql操作語句*/
----創建數據表
createtableA(keyIdint,namevarchar(20))
go
----使用insert新增數據
insertintoA(keyId,name)values(1,'a')
insertintoA(keyId,name)values(2,'b')
insertintoA(keyId,name)values(3,'c')
go
----使用update更新指定行數據
updateAsetname='test'wherekeyId=2
----使用delete刪除指定行數據
deletefromAwherekeyId=1
----使用select查詢數據
selectkeyId,namefromA
go
truncatetableA---清除當前測試表數據
droptableA---刪除測試表結構
SQL其它連接關鍵字使用:
join 連接關鍵字:
可以通過join 關鍵字將兩張及多張表進行連接,然後通過相應的查詢條件返回連接後的集合
createtableA(keyIdintprimarykey,infovarchar(60),writeDatedatetime)
insertintoAvalues
(1,'a','2017-1-1'),
(2,'b','2017-1-2'),
(3,'c','2017-1-3')
go
createtableB(keyId2int,info2varchar(60),writeDate2datetime)
insertintoBvalues
(11,'a','2017-1-1'),
(2,'b','2017-1-2'),
(2,'b2','2017-12-2'),
(13,'c','2017-1-3'),
(1,'a2','2017-1-1')
go
/*單欄位左連接進行笛卡爾運算*/
select*fromAleftjoinBona.keyId=b.keyId2
go
/*多欄位左連接進行笛卡爾運算*/
select*fromAleftjoinBona.keyId=b.keyId2andA.info=b.info2
go
truncatetableA
droptableA
truncatetableB
droptableB
SQL控制關鍵字:
sql 腳本中常用的關鍵字還有 while for if else do while 等控制語句。
SQL語句:
綜上所述SQL語句是由sql關鍵字和SQL對象名組合成sql代碼。
F. SQL中的每一張表都必須設有主鍵嗎
SQL中不是必須設置主鍵。
主關鍵字(primary key)的意思是表中的一個或多個欄位,它的值用於唯一地標識表中的某一條記錄。
在兩個表的關系中,主關鍵字用來在一個表中引用來自於另一個表中的特定記錄,主關鍵字是一種唯一關鍵字,表定義的一部分。
一個表不能有多個主關鍵字,並且主關鍵字的列不能包含空值。主關鍵字是可選的,並且可在 CREATE TABLE 或 ALTER TABLE 語句中定義。主鍵只是說對一種表和表關系的關聯而已,還有就是在建主鍵的時候會自動內添加個索引,某些情況下可以增加查詢速度容,如果只是簡單的對單表操作的話,沒有必要去設置主鍵。
(6)sql4es擴展閱讀:
結構化查詢語言(Structured Query Language)簡稱SQL(發音:/ˈes kjuː ˈel/ "S-Q-L"),是一種特殊目的的編程語言,是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系資料庫系統;同時也是資料庫腳本文件的擴展名。
結構化查詢語言是高級的非過程化編程語言,允許用戶在高層數據結構上工作。它不要求用戶指定對數據的存放方法,也不需要用戶了解具體的數據存放方式,所以具有完全不同底層結構的不同資料庫系統, 可以使用相同的結構化查詢語言作為數據輸入與管理的介面。結構化查詢語言語句可以嵌套,這使它具有極大的靈活性和強大的功能。
G. SQL的主要用途是什麼
SQL(結構化查詢語言)用於存取數據以及查詢、更新和管理關系資料庫系統。
SQL基於關系代數和元組關系演算,包括一個數據定義語言和數據操縱語言。SQL的范圍包括數據插入、查詢、更新和刪除,資料庫模式創建和修改,以及數據訪問控制。盡管很大程度上是一種聲明式編程(4GL),但是其也含有過程式編程的元素。
SQL是對埃德加·科德的關系模型的第一個商業化語言實現,這一模型在其1970年的一篇具有影響力的論文《一個對於大型共享型資料庫的關系模型》中被描述。
盡管SQL並非完全按照科德的關系模型設計,但其依然成為最為廣泛運用的資料庫語言。SQL在1986年成為美國國家標准學會(ANSI)的一項標准,在1987年成為國際標准化組織(ISO)標准。此後,這一標准經過了一系列的增訂,加入了大量新特性。
(7)sql4es擴展閱讀:
SQL是高級的非過程化編程語言,它允許用戶在高層數據結構上工作。它不要求用戶指定對數據的存放方法,也不需要用戶了解其具體的數據存放方式。而它的界面,能使具有底層結構完全不同的資料庫系統和不同資料庫之間,使用相同的SQL作為數據的輸入與管理。
它以記錄項目〔records〕的合集(set)〔項集,record set〕作為操縱對象,所有SQL語句接受項集作為輸入,回提交的項集作為輸出,這種項集特性允許一條SQL語句的輸出作為另一條SQL語句的輸入,所以SQL語句可以嵌套,這使它擁有極大的靈活性和強大的功能。
在多數情況下,在其他編程語言中需要用一大段程序才可實踐的一個單獨事件,而其在SQL上只需要一個語句就可以被表達出來。這也意味著用SQL可以寫出非常復雜的語句,在不特別考慮性能下。
H. sql語句,查詢資料庫里除了某一條記錄外的所有記錄。
1、打開sql server 可視化工具。
I. ES查詢語法
參數拼接到查詢路勁中查詢,查詢可以不指定 type 的類型
查詢結果部分欄位說明:
value值部分會作為整體被查詢, 不會被分詞, 與match做區分, match的value是會被分詞作匹配查詢的.
返回的文檔必須滿足must子句的條件,並且參與計算分值
返回的文檔必須滿足filter子句的條件。但是不會像Must一樣,參與計算分值
返回的文檔可能滿足should子句的條件。在一個Bool查詢中,如果沒有must或者filter,有一個或者多個should子句,那麼只要滿足一個就可以返回。minimum_should_match參數定義了至少滿足幾個子句, 默認情況是1
返回的文檔必須不滿足must_not定義的條件。
如果一個查詢既有filter又有should,那麼至少包含一個should子句。
bool查詢也支持禁用協同計分選項disable_coord。一般計算分值的因素取決於所有的查詢條件。
bool查詢也是採用more_matches_is_better的機制,因此滿足must和should子句的文檔將會合並起來計算分值。
使用 _source 可以只查詢需要展示的列, 相當於 sql 的 select offset,methodName from ...
from表示從第幾行開始,size表示查詢多少條文檔。from默認為0,size默認為10,
如
聚合查詢的結構:
舉例說明:
比如求所有文檔某個欄位求最大、最小、和、平均值, 可以對某個field進行計算.
以avg為例, 計算offset在所有文檔中的均值
運行結果:
該聚合一般域其它 single-value 聚合聯合使用,比如在計算一個欄位的平均值的時候,可能還會關注這個平均值是由多少個值計算而來。
例子:統計搜索結果中maiDianType欄位出現的次數
搜索結果:
基於文檔的某個值(可以是特定的欄位,也可以通過腳本計算而來),計算文檔非重復的個數(去重計數),相當於sql中的distinct。
例子: 統計搜索結果中maiDianType出現的種類
搜索結果: maiDianType共有6種值
基於文檔的某個值(可以是特定的數值型欄位,也可以通過腳本計算而來),計算出一些統計信息(min、max、sum、count、avg5個值)。
例子: 基於useTime進行值統計
ps: 這個例子中是基於腳本進行的統計
統計結果:
與stats功能相似, 比stats多4個統計結果: 平方和、方差、標准差、平均值加/減兩個標准差的區間
例子:
結果:
對指定欄位(腳本)的值按從小到大累計每個值對應的文檔數的佔比(占所有命中文檔數的百分比),返回指定佔比比例對應的值。默認返回[ 1, 5, 25, 50, 75, 95, 99 ]分位上的值,也可以指定分位置.
例子:
結果:
ps:
"1.0":30 代表: useTime<30的, 佔比1%
"99.0":237 代表: useTime<237的, 佔比99%
例子: 指定聚合的百分比
查詢結果:
詞聚合。基於某個field,該 field 內的每一個【唯一詞元】為一個桶,每個桶內可以做再次聚合.
列子: 以prodSubNo的每個值作為聚合, 聚合結果默認排序為從大到小
搜索結果:
doc_count_error_upper_bound: //文檔計數的最大偏差值
sum_other_doc_count: , //未返回的其他項的文檔數
列子: 以prodSubNo的每個值作為聚合, 得到的桶繼續做avg子聚合, 得到每個prodSubNo下的useTime的avg聚合結果
搜索結果:
基於一個條件,來對當前的文檔進行過濾的聚合。
例子: 對查詢結果進行過濾, prodSubNo=601001聚合過濾, 可對過濾後的內容進行子聚合查詢, 這里使用stats統計聚合
查詢結果:
基於多個過濾條件,來對當前文檔進行【過濾】的聚合,每個過濾都包含所有滿足它的文檔(多個bucket中可能重復),先過濾再聚合。
例子: 使用prodSubNo=601001和maiDianType=script分別對索引結果進行過濾
搜索結果:
范圍分組聚合。基於某個值(可以是 field 或 script),以【欄位范圍】來桶分聚合。范圍聚合包括 from 值,不包括 to 值(區間前閉後開)。
例子: 對於useTime欄位值進行0-20和20-40范圍內的聚合
ps: 對范圍聚合後的結果,還可以進行子聚合
搜索結果:
J. ES導致SQL注入的方式
SQL注入方法
方法1
先猜表名
And (Select count(*) from 表名)<>0
猜列名
And (Select count(列名) from 表名)<>0
或者也可以這樣
and exists (select * from 表名)
and exists (select 列名 from 表名)
返回正確的,那麼寫的表名或列名就是正確
這里要注意的是,exists這個不能應用於猜內容上,例如and exists (select len(user) from admin)>3 這樣是不行的
很多人都是喜歡查詢裡面的內容,一旦iis沒有關閉錯誤提示的,那麼就可以利用報錯方法輕松獲得庫裡面的內容
獲得資料庫連接用戶名:;and user>0
方法2
後台身份驗證繞過漏洞
驗證繞過漏洞就是'or'='or'後台繞過漏洞,利用的就是AND和OR的運算規則,從而造成後台腳本邏輯性錯誤
例如管理員的賬號密碼都是admin,那麼再比如後台的資料庫查詢語句是
user=request("user")
passwd=request("passwd")
sql='select admin from adminbate where user='&'''&user&'''&' and passwd='&'''&passwd&'''
那麼我使用'or 'a'='a來做用戶名密碼的話,那麼查詢就變成了
select admin from adminbate where user=''or 'a'='a' and passwd=''or 'a'='a'
這樣的話,根據運算規則,這里一共有4個查詢語句,那麼查詢結果就是 假or真and假or真,先算and 再算or,最終結果為真,這樣就可以進到後台了
這種漏洞存在必須要有2個條件,第一個:在後台驗證代碼上,賬號密碼的查詢是要同一條查詢語句,也就是類似
sql="select * from admin where username='"&username&'&"passwd='"&passwd&'
如果一旦賬號密碼是分開查詢的,先查帳號,再查密碼,這樣的話就沒有辦法了。
第二就是要看密碼加不加密,一旦被MD5加密或者其他加密方式加密的,那就要看第一種條件有沒有可以,沒有達到第一種條件的話,那就沒有戲了