一个表,有userid(int型)、email(varchar型)
email加了索引
请问,检索的时候,是用userid快呢,还是用email快?
数据库是mysql5.1

解决方案 »

  1.   

    具体的看一下explain select userid,email from where table1;
      

  2.   

    补充一下啊,userid是主键
    email是非空的,有唯一约束
      

  3.   

    当然是userid主键快   email是先要搜到这行数据主键userid的值  再用userid去搜索数据
      

  4.   

    可是email加了索引了啊。加了索引还是要先要搜到这行数据主键userid的值 再用userid去搜索数据吗?
    我听说如果是oracle的话,int的主键userid检索不如加了索引的email快,因为如果没建索引走全表扫描。
      

  5.   

    主要是看你的查询语句是怎么样的。
    唯一约束email 加上索引 比主键慢不了多少
      

  6.   

    SELECT * FROM empuser WHERE user_id=#user_id#;
      

  7.   

    你这个语句就是通过主键来检索的嘛 
    email 加上索引也不会对它产生什么样子的影响 对dml操作会有一定的影响
    要是你的程序里面有这样的查询:
    SELECT * FROM empuser WHERE email = XXX
    那么它用到的就是 email 上加的索引。如果你要检索出来的数据大于总数据量的30%左右 理论上说,全表扫描比索引检索的效率要高
      

  8.   

    我现在就是在
    SELECT * FROM empuser WHERE user_id=#user_id#;

    SELECT * FROM empuser WHERE email=#email#;
    之间难以取舍!
    检索出来就一条数据。
      

  9.   


    理论上是一样快。但细节上还是要看表的存储引擎是什么? 如果是INNODB,则主键会快一点儿。如果是MYISAM的则应该相同。
      

  10.   

    大侠又过来帮忙了,再次感谢,以前帮我n次了。
    建表时,定义的engine=innodb
    这么讲还是主键快了。
      

  11.   

    是这样的 引擎是INNODB的话 主键是直接定位记录的物理位置的 
    其他的索引都是指向主键索引。查询效率来说相差也不大的,查询时间是相同数量级的。
      

  12.   

    着个需要参考的有点多,看你的SQL 怎么利用索引,也看你的查询需求,可能需求不会用到其中的任何一个索引,
    同时与存储引擎有一定关系,比如选择innodb,那样会相对于其他迎亲快点,可以参考下索引的实现原理1