Mysql慢查詢
select COUNT(a.id) ucount from table_a a
left join table_b b1 on a.userId1=b1.id
left join table_b b2 on a.userId2=b2.id
left join table_b b3 on a.userId3=b3.id
where a.add_time >= '2015-06-01 00:00:00' and a.add_time <= '2017-04-06 23:59:59'
# 這條sql語句耗時0.11s。
首先b表并不參與篩選條件阱持,去除left join悼瘾。
select COUNT(a.id) ucount from table_a a
where a.add_time >= '2015-06-01 00:00:00' and a.add_time <= '2017-04-06 23:59:59';
# 耗時0.03s。
給a表add_time添加索引书闸,但是添加后同樣sql查詢時間并沒有減少尼变。
# 耗時0.03s。
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| 1 | SIMPLE | a | ALL | idx_addTime | NULL | NULL | NULL | 73104 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
# 執(zhí)行計劃中顯示索引是沒有用到的。
但是如果我把sql查詢條件做修改索引即可用到嫌术。
select COUNT(a.id) ucount from table_a a
where a.add_time >= '2017-04-01 00:00:00' and a.add_time <= '2017-04-06 23:59:59';
# 耗時0.00s哀澈。
+----+-------------+-------+-------+---------------+-------------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+-------------+---------+------+------+-------------+
| 1 | SIMPLE | a | range | idx_addTime | idx_addTime | 8 | NULL | 1625 | Using where |
+----+-------------+-------+-------+---------------+-------------+---------+------+------+-------------+
當查詢條件是'2015-06-01 00:00:00' - '2017-04-06 23:59:59' 時會命中a表中大部分數(shù)據(jù);在這種情況下度气,Mysql會放棄使用索引改為全表搜索割按。
這樣處理的原因是如果命中索引大多數(shù)數(shù)據(jù),那么使用索引會造成大量隨機I/O操作磷籍,這樣是低效的适荣;所以更好的辦法是直接全表順序掃描。
優(yōu)先隊列
Java中我們會經(jīng)常使用到PriorityQueue(優(yōu)先隊列)院领,那么優(yōu)先隊列內(nèi)部是如何實現(xiàn)弛矛,原理又是什么呢。
堆(英語:Heap)是計算機科學中一類特殊的數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱比然。堆通常是一個可以被看做一棵樹的數(shù)組對象丈氓。在隊列中,調(diào)度程序反復提取隊列中第一個作業(yè)并運行强法,因為實際情況中某些時間較短的任務(wù)將等待很長時間才能結(jié)束万俗,或者某些不短小,但具有重要性的作業(yè)饮怯,同樣應(yīng)當具有優(yōu)先權(quán)闰歪。堆即為解決此類問題設(shè)計的一種數(shù)據(jù)結(jié)構(gòu)。 -- 維基百科
n個元素序列{k1,k2...ki...kn},當且僅當滿足下列關(guān)系時稱之為堆:
(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4...n/2)
堆的實現(xiàn)通過構(gòu)造二叉堆(binary heap)蓖墅,實為二叉樹的一種库倘;由于其應(yīng)用的普遍性,當不加限定時置媳,均指該數(shù)據(jù)結(jié)構(gòu)的這種實現(xiàn)于樟。這種數(shù)據(jù)結(jié)構(gòu)具有以下性質(zhì)。
- 任意節(jié)點小于(或大于)它的所有后裔拇囊,最小元(或最大元)在堆的根上(堆序性)迂曲。
- 堆總是一棵完全樹。即除了最底層寥袭,其他層的節(jié)點都被元素填滿路捧,且最底層盡可能地從左到右填入。
對一個優(yōu)先隊列依次添加3传黄,2杰扫,1元素。
Intellij Idea使用
Key Promoter
快捷鍵總是記住了然后又忘記了,這個插件起了很好的提示作用;當你用鼠標進行某個操作時會提示你如何使用快捷鍵實現(xiàn)同樣的操作。
它會提示你同樣的操作該使用什么快捷鍵來實現(xiàn)免绿,同時告訴你用鼠標執(zhí)行了多少次凡伊。
Cmd + Shift + a
enter action or option name:想知道某個快捷鍵操作零渐,輸入關(guān)鍵字就會提示你。
比如我要找到如何刪除行快捷鍵系忙。
Git
受保護的分支
開發(fā)中诵盼,如果我們每個開發(fā)人員都可以對線上分支進行修改合并,那么可能會導致各種問題银还;把分支設(shè)置為受保護的即可解決這個問題风宁。
Git角色:
名稱 | 說明 |
---|---|
Owner | Git系統(tǒng)管理員 |
Master | Git項目管理員 |
Developer | Git項目開發(fā)人員 |
Reporter | Git項目測試人員 |
Guest | 訪客 |
developer開發(fā)人員可以在開發(fā)完畢后發(fā)出Merge Request請求,然后由Master或Owner來審核決定是否通過蛹疯。
tag標簽
在我們發(fā)布一個新版本時戒财,對當前版本做一個標記-tag,區(qū)別于其它提交苍苞。
git tag # 查看標簽
git tag -l '1.*' # 搜索以1.開頭的所有標簽
git tag -a 1.0 -m 'my version 1.0' # 包含備注的標簽 指定標簽名字 與標簽說明
git show 1.0 # 顯示指定標簽信息
git tag 1.0 # 輕量級標簽 沒有提交信息
git push origin 1.0/--tags # 推送標簽到遠程