Zi 字媒體
2017-07-25T20:27:27+00:00
在一些狀況下,資料庫的資料可能存成以下這樣
name category
Book1 1,2,3
Book2 1,3
Book3 1,8,10
Book4 2,9
Book5 1,9,11
Book6 9,25
Book7 9,12
如果要找出有 9 這個狀態的資料,可以直接在query中使用FIND_IN_SET這個函式
-- category 為欄位名稱
SELECT * FROM `table` WHERE FIND_IN_SET('9',category);
效能問題
但FIND_IN_SET這樣的做法,在資料量很大的時候非常有問題。原因是使用FIND_IN_SET並不會使用到index,所以會造成full table scan
要解決這個問題必須換個方法:
1.先把category GROUP BY 出來(縮小範圍)
SELECT * FROM `find_category` GROUP BY `category`;
2.針對 GROUP BY 的結果做FIND_IN_SET(確認結果)
SELECT * FROM (SELECT * FROM `find_category` GROUP BY `category`) as T WHERE FIND_IN_SET('9',T.category);
3.再用確認的結果去搜尋
SELECT * FROM `find_category` WHERE `category` IN ('1,9,11','2,9','9,12','9,25');
搜尋問題
另外在進行條件搜尋時,記得使用string
-- 結果只有 1
SELECT * FROM `find_category` WHERE `category` = '1';
如果是使用數字的話,除了搜尋不會用到index之外,出來的結果也會有問題
-- "1,2,3", "1", "1,8,10", "1,9,11"都會被搜出來
SELECT * FROM `find_category` WHERE `category` = 1;
Categories: MySQL
分類
Android
AngularJS
API Blueprint
Chrome
Database
MySQL
DataStructure
Docker
Editor
Vim
Firefox
Git
GitLab
Google API
Hadoop
Language
Go
Java
JavaScript
jQuery
jQueryChart
Node.js
Vue
PHP
Laravel
ZendFramework
Python
Mac
Network
Cisco
DLink
Juniper
Oauth
Server
Apache
Share
Unix
FreeBSD
Linux
WebDesign
Bootstrap
CSS
HTML
Wordpress
Search
搜尋關鍵字:
寫了
5860316篇文章,獲得
23313次喜歡