sql語法及效率

2021-07-11 19:31:08 字數 1743 閱讀 3242

應用場景:從乙個表中,根據訂單id,查詢出n個訂單的資訊

select x1,x2,x3 from y1 where z=n1 or z=n2 or z=n3...
select x1,x2,x3 from y1 where z in (n1,n2,n3....)

首選是用where in,因為:

or效率:o(n)

in 效率:o(log n)

當n很大時,or會慢很多

注意1:n最好控制在200以內

注意2:最好不要用select *

參看:石展的《mysql資料庫開發的三十六條軍規》

1、where語句裡面如果使用or則可能會放棄索引而使用全表搜尋

解決方案是如果有兩個可能性,那麼就分別選取然後用union all連線起來

2、where語句裡面如果使用》或者《可能會放棄索引而使用全表搜尋

解決方案是如果這個大於或者小於裡面只有幾個選項,那麼一一列出來

如下:

$sql = "(select * from ".$this->table_name." where sellerid=".$sellerid." and orderstatuscode=2 limit ".$offset.",".$limit.") union all (select * from ".$this->table_name." where sellerid=".$sellerid." and orderstatuscode=6 limit ".$offset.",".$limit.")";
(注意limit應該放在where語句之後)

如下:

$sql = "(select ".$this->select." from ".$this->table_name." where sellerid=? and orderstatuscode=2) union all (select ".$this->select." from ".$this->table_name." where sellerid=? and orderstatuscode=6) limit ?,?";
如:select * from mytable where selllerid=? order by createtime desc limit 20,20

order by應該放在limit的前面。

mysql每次只使用乙個索引,如果多個字段就要用聯合索引,可以將order by作為字段之一

比如:select * from mytable where selllerid=? and itemid=? order by createtime desc limit 20,20

那麼索引就是(sellerid,itemid,createtime)

null會增加運算的複雜度。所以應該預設給他乙個0或者乙個特殊值

mysql並沒有降序索引desc,都是公升序索引asc,因此,如果要做乙個order by 降序的話,需要建立的索引是一樣的

我們常用的是innodb,他的反向檢索速度是一樣的,但是myisam的反向檢索速度慢很多

比如,innodb不支援fulltext型別的索引,不儲存具體的行數。

但是innodb支援事務處理與外來鍵和行級鎖,但是myisam不支援。

"select * from %1 where catalogid=%2 order by id desc limit %3 offset %4"
參考文章:

sql分頁方式及效率比較

好久沒有運算元據庫分頁了,在看了這篇文章 後,感觸很深,萬丈高樓平地起基礎的東東還是時刻準備著。先插入100w條資料用時4 50 declare iint set i 0 while i 1000000 begin insert into pagetest select cast floor ran...

SQL語法及常用函式

insert into 表名稱 values 值1,值2,insert into 表名稱 列1,列2,values 值1,值2,select distinct 列名稱 from 表名稱 select from 表名稱 where 列1 like n 注 為萬用字元,代替多個未知條件字元 替代乙個或多...

SQL語句執行效率及效能測試

寫程式的人,往往需要分析所寫的sql語句是否已經優化過了,伺服器的響應時間有多快,這個時候就需要用到sql的statistics狀態值來檢視了。通過設定statistics我們可以檢視執行sql時的系統情況。選項有profile,io time。介紹如下 set statistics profile...