主键:
能够唯一标识一条记录的字段为主键(亦或主码),不能重复的,不允许为空。
作用:用来保证数据完整性
个数:主键只能有一个

索引:
作用:是提高查询排序的速度
个数:一个表可以有多个索引

常用索引类型:
Non-unique(非唯一索引,常用)
Unique(唯一索引,该字段没有重复值,但可以有一个空值)
Bitmap(位图索引特定于该列只有几个枚举值的情况,比如性别字段,标示字段比如只有0和1的情况)

建立索引的优点:
1. 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
2. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
3. 可以加速表和表之间的连接。
4. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

索引有一些先天不足:
1. 建立索引,系统要占用大约为表的1.2倍的硬盘和内存空间来保存索引(现在硬盘和内存的空间都很大,此问题可以忽略)。
2. 更新数据的时候,系统必须要有额外的时间来同时对索引进行更新,以维持数据和索引的一致性(建立索引的查询的效率会大大提高,建立索引的性价比高)。

使用原则:
1. 在大表上建立索引才有意义。
2. 在where子句或是连接条件上经常使用的列上建立索引,很少或从不引用的字段不建索引。
3. 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。
4. 复合索引的几个字段是否经常同时以AND方式出现在Where子句中,单字段查询极少甚至没有,将这多个字段建立复合索引。
5. 如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引。
6. 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引。
7. 逻辑型的字段,如男或女(是或否)等,不建立索引。

索引失效情况:
1. != 将不使用索引,索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中。
2. ||是字符连接函数. 就象其他函数那样,停用了索引。
3. + 是数学函数. 就象其他数学函数那样,停用了索引。
4. like "%_" 百分号在前时,停用了索引。
5. 字符型字段为数字时在where条件里不添加引号时,停用了索引。
6. 单独的>,<。
7. not in ,not exist。