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