说明:
SELECT SQL_CALC_FOUND_ROWS * FROM ib_table; SELECT FOUND_ROWS();
以上结果返回的行数不准确,始终为1或284,但是MY_ISAM及其他引擎可以使用,
原因是对于IB表的查询,IB优化器暂不支持该关键字实现计数。
参考:https://support.infobright.com/forums/showthread.php?6323-SQL_CALC_FOUND_ROWS
SELECT * FROM ib_table a,(SELECT @i:=1) b
SELECT * FROM (SELECT * FROM ib_table) x HAVING COUNT(1)>0
SELECT * FROM ib_table HAVING COUNT(DISTINCT a,b)>0当然,该写法本身可能意义不大。
以上类型的语句执行后都会报错:
[Err] 5 - The query includes syntax that is not supported by the Infobright Optimizer. Either restructure the query with supported syntax, or enable the MySQL Query Path in the brighthouse.ini file to execute the query with reduced performance.
解决方法是将infobright的默认查询解析方式更改为MySQL:
SHOW VARIABLES LIKE '%allowmysqlquerypath%'; SET GLOBAL brighthouse_ini_allowmysqlquerypath = 1;
注意了,上面的赋值会出错:
ERROR 1238 (HY000): Variable 'brighthouse_ini_allowmysqlquerypath' is a read only variable
因为该变量是只读变量,必须修改配置文件,但是在my-ib.ini 或 my-ib.cnf中加入下面这行均无效:
brighthouse_ini_allowmysqlquerypath = 1原因是brighthouse_ini开头的系统变量都必须在 brighthouse.ini(通常位于data目录)中设置:
AllowMySQLQueryPath = 1重启服务后生效:
SHOW VARIABLES LIKE 'brighthouse_ini%';
原因一是不支持INSERT,二是LOAD DATA使用的不是MySQL Loader,无法生成binlog,错误提示如下:
Binary logging not possible. Message: Statement cannot be logged to the binary log in row-based nor statement-based format
在IEE中可做如下设置(参考:Using the Infobright Loader):
SET @bh_dataformat = 'mysql';
替代方法有NFS实时同步、SCP结合CRON定时全量备份、RSYNC定时增量同步等等。
注意如果使用NFS,配置文件必须分开指定,并且同时启动两个IB很有可能会出现混乱。
Brighthouse specific error: Unable to open file or named pipe.
原因是该目录没权限:
chmod 777 dir && chgrp mysql dir
IB内建知识网格索引,因此不需要也不能显式建立字段索引,
但是它提供了一种对于数据重复率比较高的CHAR型字段的优化方式,即lookup。
给字段添加注释为lookup即可:COMMENT 'lookup'。
该选项仅在LOAD DATA时生效并自动生成,对于IEE来说,ALTER COLUMN不能添加或者删除lookup。
参考:how-and-when-to-use-lookups
如果查询中包含IB表,则使用的是IB导出规则,否则为MySQL规则。
规则分别如下:
CLAUSE |
infobright |
MySQL |
FIELDS TERMINATED BY |
';' |
'\t' |
FIELDS ENCLOSED BY |
'"' |
'' |
FIELDS ESCAPED BY |
'' |
'\\' |
注意IB中默认字段包围符是双引号,而MySQL中为空字符,
但在IB中对应的是NULL而非空字符,即“ENCLOSED BY "NULL"”;
此外IB中 ENCLOSED BY 与 ESCAPED BY子句一定要同时存在(为了防止导入包含特殊字符的数据出错)
且不为相同字符,否则会报错:ERROR 5 (HY000): An unknown system exception error caught.
在实际使用中发现,ICE版本会自动区分表引擎:
比如使用SELECT .. INTO OUTFILE(不加任何限定符)导出一个MyISAM表数据,导出的文本字段分隔符规则是按MySQL的,
然后使用load data导入到IB表中(同样不加任何FIELDS子句),此时的分隔符规则变为IB Loader的,因此导入出错。
最好的做法是明确指定所有分隔符,即使与默认值相同也要写出。
参考:Infobright_Data_Loading_Guide、Infobright数据导入转义TIP
很遗憾ICE仅支持 IB Loader的txt_variable模式,也即纯文本格式;
IEE额外支持二进制binary模式和标准MySQL Loader,这也是实现写binlog的关键。
在ICE中做如下设置是不可行的:
SET @bh_dataformat = 'mysql'; SET @bh_dataformat = 'binary';
设置的时候不会出错,但是执行load data或者select .. into outfile语句的时候会报错:
ERROR 1149 (42000): Brighthouse specific error: Unknown value of BH_DATAFORMAT parameter
使用中发现,做数据统计时需要将查询IB表的结果导到新的IB表,但在并发较多时,
(线程数20左右,单个查询平均耗时20s,平均查询量在1亿,平均结果量10W)
会小概率出现EXPORT出的文本损坏,如部分行不完整,字段字符断裂,或者行丢失等问题,
目前使用的是最新版本 IB_4.0.7_r16961_17249(ice),暂不知道什么原因。
解决办法是重新执行查询生成文本。
SELECT ID,USER,HOST,DB,COMMAND,TIME,STATE,SUBSTR(INFO,1,60) FROM information_schema.processlist;执行上述查询发现大量load data线程都停止,STATE状态为:system lock
IB has only table-level locks. When doing any write operation to a table an exlusive lock is set on it and any other queries needing this table must wait until the writing transaction commits. And vice versa - if a table is used for reading, loading must wait.
IB只有表级别锁,可以理解并发写入时会锁表,这点与MyISAM有点类似;
另一方面IB目前使用的MySQL是5.1.40,processlist显示的准确性和详细度不如5.5以上版本。
此外,由于ICE对线程数有一定限制,并且单个查询或者loader线程使用的内存也有限制,
具体设置见brighthouse.ini:ServerMainHeapSize、LoaderMainHeapSize
因此尽量减少单表的并发操作,合理采用『分表、分库、分实例』来解决。
参考:关于数据库 System lock 状态的说明和处理方式