合成索引只能用于精确匹配的场景,在一定程度上减少了磁盘I/O,提高了查询效率。如果需要对BLOB、CLOB字段进行模糊查询,可以使用MySQL的前缀索引,即为字段的前n列创建索引。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
mysql> create index idx_blob on t (content(100)); Query OK, 0 rows affected (0.09 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show index from t \G *************************** 1. row *************************** Table: t Non_unique: 1 Key_name: idx_blob Seq_in_index: 1 Column_name: content Collation: A Cardinality: 3 Sub_part: 100 Packed: NULL Null: YES Index_type: BTREE Comment: Index_comment: 1 row in set (0.00 sec) mysql> desc select * from t where content like 'beijing%' \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: t type: ALL possible_keys: idx_blob key: NULL key_len: NULL ref: NULL rows: 3 Extra: Using where 1 row in set (0.00 sec)
(3)、不要在不必要是检索大型的BLOB或TEXT字段。
(4)、把BLOB或TEXT字段分离到单独的表中。
三、浮点数和定点数
浮点数一般用于表示含有小数部分的数值。当一个字段被定义为浮点类型以后,如果插入数据的精度超过了该列定义的实际精度,则插入值会被四舍五入到实际定义的精度值,然后插入,四舍五入的过程不会报错。MySQL中的float、double(real)用来表示浮点数。
定点数不同于浮点数,定点数实际上是用字符串形式存放的,所以定点数可以更精确的存放数据。如果插入数据的精度大于实际定义的精度,则MySQL会发出告警,但数据按照实际精度四舍五入后插入(如果是在传统模式下插入,则会报错)。在MySQL中,用decimal(或numberic)来表示定点数。
用浮点数存储数据会存在误差,在精度要求比较高的场景(如货币),应该使用定点数来存放数据。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13
mysql> create table b (c1 float(10,2),c2 decimal(10,2)); Query OK, 0 rows affected (0.37 sec) mysql> insert into b values (131072.32,131072.32); Query OK, 1 row affected (0.00 sec) mysql> select * from b; +-----------+-----------+ | c1 | c2 | +-----------+-----------+ | 131072.31 | 131072.32 | +-----------+-----------+ 1 row in set (0.00 sec)
四、日期类型
MySQL提供的常用的日期类型有:date、time、datetime、timestamp,日期类型的选用原则:
(1)、应根据实际需要选择能够满足应用的最小存储的日期类型;
(2)、如果要记录年月日时分秒,且年代比较久远,最好使用datetime类型;
(3)、如果记录的日期要被多时区的用户所使用,那么最好使用timestamp类型。