天天看点

MYSQL-字符主键对性能的影响

1、创建表: mysql> show create table c\G; *************************** 1. row ***************************        Table: c Create Table: CREATE TABLE `c` (   `id` varchar(10) NOT NULL,   `name` varchar(20) DEFAULT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec)

ERROR: No query specified

注意到上边的主键是id,同时这个id的类项是varchar类型,下边我们通过解析查询看看主键有没有起作用,也可以说看看效率如何: 2、解析查询: mysql> select * from c where id=3; +-----+------+ | id  | name | +-----+------+ | 003 | ke   | | 3   | ke   | +-----+------+ 2 rows in set (0.06 sec) 这时候当where后边是3时,选择了两条记录,再看看解析的结果: mysql> explain select * from c where id=3\G; *************************** 1. row ***************************            id: 1   select_type: SIMPLE         table: c          type: ALL possible_keys: PRIMARY           key: NULL       key_len: NULL           ref: NULL          rows: 7         Extra: Using where 1 row in set (0.00 sec)

ERROR: No query specified 可以看出来,possible_keys: PRIMARY有设定值,但是实际上key: NULL没有被应用,所以说这个设定没有提高效率,也可以说根本就没有起到作用。 如果我们这么操作,可以对比一下结果: mysql> select * from c where id='3'; +----+------+ | id | name | +----+------+ | 3  | ke   | +----+------+ 1 row in set (0.00 sec) 仔细看看是 where id='3'此时的3是字符的形式传入的,所以结果也只有一条,同时也可以解析该命令,看看结果如何: mysql> explain select * from c where id='3'\G; *************************** 1. row ***************************            id: 1   select_type: SIMPLE         table: c          type: const possible_keys: PRIMARY           key: PRIMARY       key_len: 12           ref: const          rows: 1         Extra: 1 row in set (0.00 sec)

ERROR: No query specified 可以看出这时候  key: PRIMARY 是有作用的,也就是说在创建主键的时候id的字符集类型并不适合,即便是应用的改类型,那么也要在开发中写对查询语句中的条件,否则设定的主机没有起到实际的作用。 3、总结 从以上简单的测试可以看出,设定主键要真正的了解类型,应用最准确的类型,开发中同时也要注重sql语句中条件的写法,尽量切换设定主键或者其它约束的本意。

IT

继续阅读