全值匹配我最愛,最左字首要遵守;
帶頭大哥不能死,中間兄弟不能斷;
索引列上少計算,範圍之後全失效;
like百分寫最後,覆蓋索引不寫星;
不等空值還有or,索引失效要少用。
使用in查詢的時候,其實是範圍查詢,如果查詢列是索引列則explain的結果是range型別
group by操作會先排序然後再分組,如果分組的列不是索引列會使用temporary table和file sort
in和exists優化原則:小表驅動大表.
eg:
1、如果b表小於a表則in優於exists (b表驅動a表查詢,可以看執行計畫)
select id from a in (select id from b)
2、如果a表小於b表則exists優於in (a表驅動b表查詢)
select id from a exists (select id from b)
mysql的可重複讀的隔離級別使用了mvcc機制,select不會更新版本號,是快照讀(歷史版本),insert, update, delete會更新版本號,是當前讀(當前版本)。
1、其中幻讀的情況就是,乙個事務讀取(只用select是不會出現的,如果是用update where操作就可能會出現這種情況)到了另外乙個事務新增的資料。
出現這種原因主要是mvcc下分為:快照讀和當前讀。快照讀就是讀取資料的時候會根據一定規則讀取事務可見版本的資料。 而當前讀就是讀取最新版本的資料。
1> 什麼情況下使用的是快照讀:(快照讀,不會加鎖)一般的
select * from .... where ...
2> 什麼情況下使用的是當前讀:(當前讀,會在搜尋的時候加鎖)
select * from .... where ... for update
select * from .... where ... lock in share mode
update .... set .. where ...
delete from. . where ..
產生幻讀的情況主要是快照讀和當前讀混用導致的,如果只使用快照讀或者當前讀則可以解決這個問題。
2、髒讀:乙個事務讀取到了另外乙個事務未提交的資料。
3、不可重複讀:乙個事務讀取到了另外乙個事務提交的資料(在乙個事務中重複讀的話會出現兩次讀到的資料不一致的情況)。
4、幻讀可以使用srializeable隔離級別,同時在某些場景下也能使用間隙鎖(比如使用update user set name = 'laowu' where id > 5 and id < 100則其他session沒法插入這個範圍的資料)來解決。
5、盡可能讓所有的查詢都走索引,不然可能會由行級鎖公升級為表鎖。
6、鎖的分類:
從效能上來說分為樂觀鎖(通過版本控制)和悲觀鎖
從對資料庫的操作上分為:讀鎖(共享鎖)和寫鎖(排他鎖)
從對資料庫操作的鎖的粒度分為:行鎖和表鎖
幻讀的復現操作:
1.建立資料庫表, 並插入以下資料create table `author` (
`id` int(11) not null auto_increment,
`name` varchar(255) default null,
`age` int(11) default null,
primary key (`id`)
) engine=innodb auto_increment=0 default charset=utf8;
insert into author values (1,'g1',20),(5,'g5',20),(15,'g15',30),(20,'g20',30);
2. 復現過程
操作步驟
第乙個會話
第二個會話
1begin;
begin;
2select * from `author` where age = 20;
3insert into author values (123, 'g123', 20);
4commit;
5update author set name = 'asdasd123123' where age = 20; (這裡會發現更新了3條數資料)
或者delete from author where age = 20; (這裡會發現刪除了三條資料)
6select * from `author` where age = 20;
7commit;
SQL優化口訣
1 避免在where子句中使用 is null 或 is not null 對欄位進行判斷。如 select id from table where name is null 在這個查詢中,就算我們為 name 字段設定了索引,查詢分析器也不會使用,因此查詢效率底下。為了避免這樣的查詢,在資料庫設計...
查詢優化(MySQL優化查詢)
關聯查詢太多join 設計缺陷或不得已的需求 資料庫伺服器調優及各個引數設定不適當 緩衝 執行緒數等 慢查詢日誌 找出執行速度慢的sql語句 慢查詢的開啟並捕獲 explain 慢sql分析 show profile查詢sql在mysql伺服器裡面的執行細節和生命週期情況 sql資料庫伺服器的引數調...
mysql統計查詢優化 Mysql查詢優化
效能涉及的層面很多,但是在操作層面,主要有表結構設計優化 索引優化和查詢優化 查詢的生命週期大致可以分為,從客戶端 到服務端 在伺服器上解析 生成執行計畫 執行 返回結果給客戶端 sql執行流程 具體優化技巧 1.消除外連線 2.消除子查詢 盡量用join代替子查詢,雖說mysql查詢優化器會進行優...