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语句中条件的写法,尽量切换设定主键或者其它约束的本意。