2010-03-06 29 views
5

我想設置一個MySQL實例來平抑拒絕某些類型的查詢。例如,任何不使用索引的JOIN應該只會失敗並死亡,並顯示在應用程序堆棧跟蹤上,而不是運行緩慢並顯示在slow_query_log上,而沒有簡單的方法將其與導致它的實際測試用例聯繫起來。對MySQL有沒有某種「嚴格的性能模式」?

此外,我想禁止「*」(如在「選擇*從...」),並有基本上拋出語法錯誤。從MySQL性能角度來看,任何有疑問或危險的東西都只會導致錯誤。

這可能嗎?除了破解MySQL內部結構......有沒有簡單的方法?

+2

這是不可能的AFAIK – 2010-03-06 01:24:46

+1

不知道你在用哪種語言,但是你可能會在實際的mysql函數調用前插入一個鉤子,根據你的標準拒絕查詢(通過拋出一個異常或其他東西) 。 – Seth 2010-03-06 01:32:43

+0

爲什麼人們總是想要一個* easy *的方式?那裏的樂趣在哪裏?! xD - 我不知道一個,爲了記錄。我首先想到的是塞思發佈的同樣的東西;在前端放置一個過濾器。 – Atli 2010-03-06 01:45:31

回答

1

如果您確實想要控制用戶/程序員通過SQL執行的操作,則必須在MySQL和您的代碼之間設置一個限制訪問的層,例如只允許訪問某些表的ORM,並且僅限某些查詢。然後您可以檢查以確保表格有索引等。

您將無法確定查詢是否使用索引。這由數據庫中的查詢優化器層決定,邏輯可能會變得非常複雜。

+0

ORM的問題在於它位於應用程序開發人員的領域,而不是DBA的領域,所以沒有任何解決方案。但我會選擇這個答案作爲技術上的正確,因爲可能唯一可行的選擇是存儲過程形式中的另一個「層之間」(以及從所有表中撤銷選擇!) – 2010-03-07 20:41:17

+0

Alex:對於大多數標準ORMs都是如此,但這是一個實施點。如果你仔細想想,ORM有兩個方面,一個面向應用 - 提供對象視圖。一個面向DB。沒有理由爲什麼雙方必須以相同的方式進行控制/組織。在我的公司,我們有一個ORM,在這兩方之間,在中間使用RPC。所以面向數據庫的方面完全在DBA的領域,面向應用程序的應用程序在應用程序領域。只需要在應用程序的API上達成一致,並且API的實現是由DBA驅動的。 – OverClocked 2010-03-08 15:02:34

0

不可能。

你可以做些什麼來使事情更好地工作,是創建你優化的視圖,並讓用戶只能訪問這些視圖。現在你確定相關的SELECT將使用索引。

但他們仍然可以破壞性能,只是瘋狂地加入一些意見和表現已經消失。

0

據我所知,MySQL沒有提供這種功能,但任何「不可能」或類似的答案都是不正確的。如果你真的想這樣做,那麼你總是可以自己添加功能,但不幸的是,這肯定會被稱爲「破解MySQL內部」。

相關問題