最近為了挖掘mysql的性能,使用了HandlerSocket來訪問數(shù)據(jù),表現(xiàn)確實還不錯,特別是使用merge表的時候。
但是HandlerSocket(一下簡稱hs)本身的文檔比較少,出錯信息不是很友好,出錯的時候比較難定位問題,往往要翻閱其源代碼,這里分享兩個我最近遇到的問題:
表結構如下:
mysql> show create table tab_xxx\G
*************************** 1. row
***************************
Table: tab_xxx
Create Table: CREATE
TABLE `tab_xxx` (
`Type` char(2) DEFAULT NULL,
`flag` char(1)
DEFAULT NULL,
`count` char(2) DEFAULT NULL,
`file_id` char(10)
DEFAULT NULL,
`exc_id` char(4) DEFAULT NULL,
`FileType` char(2)
DEFAULT NULL,
`subno` char(24) DEFAULT NULL,
KEY `idx_subno`
(`subno`)
) ENGINE=InnoDB
使用hs訪問的時候我使用了如下語句:
client->request_buf_open_index(id, "db_name", "table_name", "subno",
"EventFormatType, roll_flag, roll_count, file_id, exc_id, FileType,subno",
0);
該語句在運行是報以下錯誤:2 idxnum,看得一頭霧水,沒辦法只好翻閱一下源代碼,搜索
idxnum,找到了問題,KEY的名稱必須使用idx_subno,這個問題解決了,重新編譯運行,另一個問題又來了,報以下錯誤:2
fld,有了前面的經(jīng)驗,繼續(xù)搜索源代碼,原來hs列之間只能使用","分隔,不能有其他空格等字符,這個是在代碼里面寫死了的,于是修改如下:
client->request_buf_open_index(id, "db_name", "table_name", "idx_subno",
"EventFormatType,roll_flag,roll_count,file_id,exc_id,FileType,subno", 0);
這次終于運行成功了。
總結:
1、key要使用key名稱,不能使用列名稱;
2、列之間只能用","分隔,不能有其他空格等字符;