2014-06-07 46 views
0

我即將開發基於PHP/MySQL的聊天系統。數據庫和網站都將在同一臺服務器上運行。我希望能夠同時在線支持300個用戶。這顯然會繼續產生大量的查詢。因此,優化數據庫設計是必須的。需要關於如何進一步優化數據庫的建議

我的MySQL技能是一般的。我盡我所能去學習優化,並盡我所能瞭解自己。但我不確定它是否足夠好。我希望你們可以看看它,並就如何進一步優化提供建議。

有關如何減少服務器負載的任何其他技巧也是受歡迎的。請記住,所有信息都必須根據當地法律予以保存。

CREATE TABLE IF NOT EXISTS `bans` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `userid` int(11) NOT NULL, 
    `ipaddress` varchar(32) NOT NULL, 
    `reason` text, 
    `bandate` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `BAN_INDEX` (`userid`,`ipaddress`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `chatboxes` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `boxname` varchar(32) NOT NULL, 
    `password` varchar(32) NOT NULL, 
    `accesslvl` tinyint(1) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `BOX_INDEX` (`boxname`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `ignorelist` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `userid` int(11) NOT NULL, 
    `blockedusr` varchar(16) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `messages` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `userid` int(11) NOT NULL, 
    `boxname` varchar(32) NOT NULL, 
    `message` text, 
    `receiver` varchar(16) NOT NULL, 
    `alert` tinyint(1) NOT NULL DEFAULT '0', 
    `msgdate` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(16) NOT NULL, 
    `password` varchar(32) NOT NULL, 
    `email` varchar(64) NOT NULL, 
    `gender` tinyint(1) NOT NULL DEFAULT '0', 
    `sexpref` tinyint(1) NOT NULL DEFAULT '0', 
    `birthdate` date DEFAULT NULL, 
    `regdate` datetime DEFAULT NULL, 
    `lastlogin` datetime DEFAULT NULL, 
    `warnings` tinyint(1) NOT NULL DEFAULT '0', 
    `accesslvl` tinyint(1) NOT NULL DEFAULT '1', 
    `kicks` tinyint(3) NOT NULL DEFAULT '0', 
    `ipaddress` varchar(32) NOT NULL, 
    `online` tinyint(1) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `USER_INDEX` (`username`,`email`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 
+0

如果你downvote我的問題,請添加評論爲什麼我可以改善它。沒有反饋就無法學習。 – icecub

+0

不幸的是,它通常不會以這種方式工作。爲了獲得關於SO下調的態度以及是什麼導致了一個很好的問題,請看看[post](http://meta.stackoverflow.com/questions/252677/when-is-it-justifiable-to -downvote-a-question)在meta stackoverflow上。 – mseifert

回答

1

雖然我不知道你的選擇的原因,我建議爲表其存儲在users表(bansignorelistmessages)給用戶的參考,您應該存儲用戶的主鍵id(創建一個userid字段將這些數據存儲在每個這些表中)而不是username。這將允許規範化的數據。如果用戶更改了他的名字,則不想返回並更新所有其他表格。另外,IP地址並不總是靜態的,所以除非你只是禁止一個用戶從一個特定的IP地址(不是很有效),並假設用戶必須登錄聊天,否則我會建議根據userid所以你有你的UNIQUE KEYuserid

要查詢的禁令,顯示了用戶名作爲結果集的一部分,你加入到bansusers(如SELECT bans.reason, users.username FROM bans JOIN users ON bans.userid = users.id

希望這有助於。

+0

儘管用戶不允許更改他們的用戶名,但有些情況下主持人被迫更改用戶名。我確實看到了在任何地方都使用id引用代替用戶名的好處,並且會立即執行它。 至於禁令制度,將會有兩種類型:賬戶禁令和知識產權禁令。我知道這不是很有效。但沒有客戶端軟件,這是我猜的最好的。 感謝您的幫助:) – icecub

+0

雖然我希望能對我的數據庫設計提供更多建議和反饋,但您似乎是唯一一個花時間幫忙的人。因此,我接受你答案的答案。再次感謝您的幫助。 – icecub

相關問題