從這幾個(gè)方面入手
1.建立一些有效的索引,索引是比較影響查詢速度的,它可以快速的定位到你要查詢的數(shù)據(jù),如果有多個(gè)條件的話可以建立聯(lián)合索引,但要注意聯(lián)合索引的順序,比如有一個(gè)這樣的索引,有以下這些字段,(user_id,type_id,views (瀏覽次數(shù)))當(dāng)我們寫查詢語句的時(shí)候,mysql會(huì)從左往右匹配索引。比如我們這么寫 (加入表名叫post)select * from post where user_id = 1 and views > 2 ,如果這樣的話,我們的索引只匹配到了user_id 就不匹配了,因?yàn)閙ysql只能順序的匹配索引。索引的順序也很重要,一般是將區(qū)分度比較高的索引放在最左側(cè),比如 上邊的例子,因?yàn)橐粋€(gè)網(wǎng)站里用戶的數(shù)量正常來說會(huì)比類型的數(shù)量要多很多,所以用戶id的區(qū)分度比較高。
2.如果實(shí)在是無法避免條件確實(shí)不夠,比如上例子確實(shí)只需要這兩個(gè)條件(user_id,views),如果是這兩個(gè),mysql就只能匹配user_id,而type_id 無法匹配,由于type數(shù)量并不多,那么我們可以在語句中加入 and type in(此處填寫所有類型id,當(dāng)然如果類型特別多就不要這么干了)。這樣的話,建立的索引就能全部匹配。
3.盡可能的用合適的數(shù)據(jù)類型來表示數(shù)據(jù),定長的數(shù)據(jù)char要比varchar優(yōu)秀,如果表示狀態(tài)的話tinyint要比int好。
4.如果數(shù)據(jù)量特別多,需要統(tǒng)計(jì)條數(shù)的話,如果不是需要非常精確的數(shù)字 explain 的row 是比較快的方式,它比count要快。
5.切分查詢,比如,有這樣一個(gè)需求。查詢出所有文章(post),并且包含作者的名字也就是user_name ,一般的話,我們會(huì)想到去連表,但我們可以把這個(gè)查詢切分開來,先用一個(gè)sql查詢出所有文章,再通過代碼拿到所有user_id,然后用in去user表中查詢,最后將查詢的結(jié)果合并,這么做雖然有些麻煩,但有時(shí)會(huì)是比較快的選擇,因?yàn)?,?dāng)我們將查詢分開的時(shí)候,如果此前有程序做過同樣的查詢,mysql就不會(huì)執(zhí)行一遍查詢語句,而是會(huì)直接從緩存里取數(shù)據(jù)。
6.如果數(shù)據(jù)量不大,建議還是全表掃比較快,因?yàn)楫吘顾饕灿谐杀尽?/p>
代理id,上級(jí)id,所屬層級(jí)
看截圖應(yīng)該不涉及后臺(tái)接收數(shù)據(jù),在browser的network里看兩次請(qǐng)求的formdata都是一樣的,建議排查js
非靜態(tài)代碼塊用的不多,但靜態(tài)代碼塊還是比較常用的,比如你要在類初始化的時(shí)候加載一個(gè)配置文件。
oracle主鍵log_id 不能自動(dòng)遞增
有兩個(gè)辦法:
1、使用oracle的自動(dòng)增長序列
創(chuàng)建序列
create sequence S_T_THINK_LOG
increment by 1 //指定序列以1遞增,如果沒指定,默認(rèn)值1會(huì)使用
start with 1 //由1開始計(jì)數(shù)
nomaxvalue //不設(shè)置最大值
minvalue 1 //設(shè)置最小值1
cache 20 //預(yù)分配緩存大小為20
order
// 獲取下一個(gè)自增ID
public function getNextSeq(){
$sql = "select S_T_THINK_LOG.nextval id from sys.dual";
$result = $this->query($sql);
$nextId = $result[0]['id'];
return $nextId;
}
function writelog($uid,$username,$description,$status)
{
// 注意這里啦
// 注意這里啦
$data['log_id'] = $this->getNextSeq();
$data['admin_id'] = $uid;
$data['admin_name'] = $username;
$data['description'] = $description;
$data['status'] = $status;
$data['ip'] = request()->ip();
$data['add_time'] = time();
$log = Db::name('think_log')->insert($data);
}
第二種,就是樓上說的 觸發(fā)器啦
create or replace trigger trg_TINK_LOG
before insert on TINK_LOG
for each row
declare
begin
:think_log.LOG_ID:= S_T_THINK_LOG.NEXTVAL;
end trg_t1;你好, 你所描述的問題是一個(gè)非常初級(jí)的 web黑 領(lǐng)域問題。
在暴露有公網(wǎng)權(quán)限的mysql數(shù)據(jù)庫的情況下,黑客通常是無目的性地遍歷全網(wǎng)ip地址進(jìn)行端口掃描(最知名的工具非nmap莫屬了,開源免費(fèi)的),通過tcp連接當(dāng)中的一些字段信息(被俗稱指紋)來確定這是一個(gè)暴露在公網(wǎng)的mysql服務(wù)。
發(fā)現(xiàn)了mysql服務(wù)后,通常會(huì)猜測(cè)一些可能的username password排列組合,這在安全技術(shù)當(dāng)中俗稱暴破攻擊,然后由于root admin這種username是使用的最多的,很多新手都會(huì)使用 因?yàn)槭悄J(rèn)的,所以他們往往會(huì)猜測(cè)這些value。
然后你可能會(huì)問,那么密碼他怎么知道該猜些什么? 網(wǎng)上其實(shí)流傳有很多免費(fèi)的密碼字典,這些往往最初是從黑市上流傳出來的,一般是一些大網(wǎng)站遭遇拖庫攻擊之后泄露的, 黑客一般會(huì)采取首先手動(dòng)輸入幾個(gè)詞 之后用自動(dòng)化工具批量嘗試密碼。
再教你個(gè)小技巧,如果你也想搞一些密碼字典來用, 除了去網(wǎng)上找這種字典之外,還有個(gè)更簡(jiǎn)單的辦法, 就是故意開設(shè)一個(gè)公網(wǎng)mysql服務(wù),端口設(shè)默認(rèn)的3306, 故意引誘黑客來掃你, 然后在日志里去捕撈黑客們免費(fèi)送給你的這些密碼,去重后你就整理出了自己的一份密碼字典~ 這個(gè)思路 在安全技術(shù)領(lǐng)域中 被稱為“蜜罐”。
這些是比較入門級(jí)的 web黑客 伎倆,掃你端口的多半是些初學(xué)的腳本小子,如果說書籍推薦的話, 對(duì)于web黑客領(lǐng)域, 最為經(jīng)典的應(yīng)該當(dāng)屬 道哥的《白帽子講web安全》 和 余弦的《web前端黑客技術(shù)揭秘》。
以上兩本比較經(jīng)典,還有些新書,買的話注意出版的年份 別買太早的。
希望能幫到你,有問題請(qǐng)留言或關(guān)注我 微博: https://weibo.com/u/5114485810 推特:https://twitter.com/zhu_yingda
把認(rèn)證庫也放在esign中,而不是admin就好了。不知道為什么?。?!
昨天又試了一遍
到第二頁的頁面中F12之后發(fā)現(xiàn)爬取規(guī)則變了
一頓無語之后,重新定義了第二頁之后的規(guī)則,然后問題解決了
A表stu_id 應(yīng)該為唯一索引或主鍵,結(jié)果不存在重復(fù)的情況。即使學(xué)生名字重復(fù)也應(yīng)該顯示。
SELECT A.stu_id,A.name FROM A JOIN B ON A.stu_id = B.stu_id JOIN C ON C.stu_id = A.stu_id
1.有不確定列--->這個(gè)是沒有必要的,必須的列應(yīng)該相對(duì)固定的,如果不固定,從幾十個(gè)到幾百個(gè),你呈現(xiàn)數(shù)據(jù)的時(shí)候怎樣呈現(xiàn)?
你都不確定有哪些列,你前端頁面怎么寫?
真要有一些可有可無的字段,你可以統(tǒng)一把它存在一個(gè)字段或另一個(gè)表中。
2.比如回復(fù)這個(gè)字段,可能有上百萬-->回復(fù)的內(nèi)容不可能和存文章的表是同一個(gè)吧?
回復(fù)當(dāng)然是需要獨(dú)立的一個(gè)表。
當(dāng)一個(gè)字段需要存多個(gè)結(jié)果時(shí),一般這個(gè)字段的內(nèi)容會(huì)獨(dú)立到另一個(gè)表中。
3.雖然 mongodb 沒有像關(guān)系型數(shù)據(jù)庫那么多限制,但基本的設(shè)計(jì)我覺得還是得按關(guān)系型數(shù)據(jù)庫來。
你把所有東西都放到一個(gè)表中,你批量查詢的時(shí)候是應(yīng)該比較快的,但你想精確查找的時(shí)候可能很麻煩,還有就是寫入也可能很麻煩。
比如回復(fù),如果你回復(fù)的內(nèi)容是存在文章表中的“回復(fù)”字段的話,每次添加一條回復(fù)的時(shí)候,你得把原數(shù)據(jù)先查出來,再把回復(fù)數(shù)據(jù)的內(nèi)容拿出來,還需要循環(huán)一遍看回復(fù)的內(nèi)容有沒有重復(fù)。
原來是我想多了,其實(shí)沒那么復(fù)雜![手動(dòng)大哭、、、]
這是一個(gè)很基本的操作,無論在任何問答網(wǎng)站提出這種問題都會(huì)被別人踩,因?yàn)榇蠹叶紩?huì)覺得你沒有自己動(dòng)過腦筋就開始問。實(shí)際上mongoose已經(jīng)有很完整的文檔教你怎么入門,先看一下有疑問再提問。
http://mongoosejs.com/docs/
1000條數(shù)據(jù)不算太大吧。
既然存在關(guān)聯(lián)關(guān)系,你還強(qiáng)行把它拆到兩個(gè)庫中,醉醉的。
當(dāng)然你可以說你決定不了,這是上層拍腦袋決定的。
一個(gè)方案就是定時(shí)冗余一個(gè)UserID表到你當(dāng)前的數(shù)據(jù)庫中方便聯(lián)表查詢,或者運(yùn)用第三方搜索軟件,整合各個(gè)數(shù)據(jù)庫的數(shù)據(jù),加快搜索,比如solr、sphinx。
alter table aa add column col_name int,add index idx_1(col_name);
不推薦存數(shù)據(jù)庫中,假如站點(diǎn)訪問量大的時(shí)候,對(duì)數(shù)據(jù)庫會(huì)頻繁寫入,頻繁讀取,從而影響數(shù)據(jù)庫性能。一般用redis memcache存更好些。而且維護(hù)過期時(shí)間等也方便。設(shè)置key過期時(shí)間就好。
沒用過Laravel,但是解決思路一樣的,哥子,我給你個(gè)偽代碼:
$transaction = (new Transaction());
try {
$setBalanceResult = UserModel::model()->set('balance',-100.00);
if (!$setBalanceResult) throw new \Exception('修改余額失?。?);
$createBalanceRecord = BalanceRecord::model()->create([
'user_id' => $user_id,
'content' => 'XXX使用了100元'
]);
if (!$createBalanceRecord) throw new \Exception('寫入余額日志記錄失敗');
$order = Order::model()->create([
// 這里是訂單數(shù)據(jù)
]);
if (!$order) throw new \Exception('訂單創(chuàng)建失敗');
// 把發(fā)消息添加到發(fā)送消息隊(duì)列程序,通過隊(duì)列任務(wù)程序從隊(duì)列里取消息發(fā)送 start
(new Queue())
->sendMsg('你的余額已經(jīng)變動(dòng)')
->sendMsg('下單成功');
// 把發(fā)消息添加到發(fā)送消息隊(duì)列程序,通過隊(duì)列任務(wù)程序從隊(duì)列里取消息發(fā)送 start
$transaction->commit(); // 沒有問題提交事務(wù)
} catch(\Exception $e) {
$transaction->rollback(); // 出錯(cuò)事務(wù)回滾
var_dump($e->getMessage()); // 打印錯(cuò)誤,具體還可以進(jìn)行異常返回到更上層
}
--sql server的寫法
SELECT name,
STUFF((SELECT','+ convert(VARCHAR(200),address) FROM [TableName] WHERE name=V.name FOR XML PATH('')),1,1,'') AS Newaddress,
MAX(arrive_time) AS Maxtime
FROM [TableName] V
GROUP BY nameselect A.id,A.xmmc,count(distinct A1.id) cnt from A left join A1 on A.id<=A1.id and A.xmmc=A1.xmmc group by A.id
這種寫法執(zhí)行效率會(huì)更高,也容易理解內(nèi)在邏輯關(guān)系,同時(shí)當(dāng)需要對(duì)次數(shù)進(jìn)行分類整理時(shí),case when寫起來也比較簡(jiǎn)單。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。