V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
leonwong
V2EX  ›  MySQL

InnoDB不支持hash索引,怎么破?

  •  
  •   leonwong · 2013-07-30 15:26:31 +08:00 · 8407 次点击
    这是一个创建于 3922 天前的主题,其中的信息可能已经有所发展或是发生改变。
    RT,有些字段例如保存用户密码的无序的MD5字段我觉得很有必要使用hash索引,但是InnDB不支持hash,如果换成MyISAM又不支持事务,怎么破,不过据说InnoDB有自适应hash索引,不知道效果如何?懂的人麻烦吱声下,谢谢啦
    19 条回复    1970-01-01 08:00:00 +08:00
    holystrike
        1
    holystrike  
       2013-07-30 15:39:55 +08:00
    密码字段为什么需要建索引呢?
    0bit
        2
    0bit  
       2013-07-30 15:44:34 +08:00
    很好破,一劳永逸,用PostgreSQL
    leonwong
        3
    leonwong  
    OP
       2013-07-31 07:48:32 +08:00
    @holystrike 因为where子句后接密码字段,而且无序排列,索引查找应该会更快定位
    leonwong
        4
    leonwong  
    OP
       2013-07-31 08:05:26 +08:00
    @0bit 转换数据库系统成本可能会有点高
    Actrace
        5
    Actrace  
       2013-07-31 08:21:51 +08:00
    我有个库1.8T的数据(3000W+数据),里面用32char的MD5做唯一性索引,现在的响应速度是1秒内。
    GTim
        6
    GTim  
       2013-07-31 09:58:56 +08:00
    XX 密码字段带入查询,汗啊
    coderliss
        7
    coderliss  
       2013-07-31 10:48:54 +08:00
    汗,古怪的需求就是这样子来的。
    zhicheng
        8
    zhicheng  
       2013-07-31 11:18:28 +08:00
    @Actrace MD5 建议用 binary(16)
    jimrok
        9
    jimrok  
       2013-07-31 12:31:56 +08:00
    你把md5带入sql,一旦被sql注入,你就糗大了。
    leonwong
        10
    leonwong  
    OP
       2013-07-31 14:13:11 +08:00
    @Actrace 谢谢提供数据参考
    leonwong
        11
    leonwong  
    OP
       2013-07-31 14:14:00 +08:00
    @jimrok 那该如何解决
    xlogion
        12
    xlogion  
       2013-07-31 14:18:01 +08:00   ❤️ 1
    @leonwong 完全可以按照用户名查询用户,然后对比结果的密码字段,没必要带着密码字段一同查询
    jimrok
        13
    jimrok  
       2013-07-31 14:19:51 +08:00   ❤️ 1
    @leonwong select users.password_hash,users.salt from users where users.email = 'login_email'

    if (users.password == 'your hash string' then
    leonwong
        14
    leonwong  
    OP
       2013-07-31 14:21:46 +08:00
    @xlogion 懂你们意思了,谢谢
    leonwong
        15
    leonwong  
    OP
       2013-07-31 14:22:01 +08:00
    @jimrok 懂你意思了,万分感谢
    rwx
        16
    rwx  
       2013-07-31 14:22:01 +08:00
    为什么WHERE查询里会有密码做为条件?难道连比较密码这种事情也要数据库帮做么。。

    让我想起以前见过的一个项目,php的全部作用就是根据路由参数向数据库做一个查询,所有的业务逻辑都写成存储过程由数据库执行。。
    leonwong
        17
    leonwong  
    OP
       2013-07-31 14:23:22 +08:00
    @rwx 我是没有想过sql注入这个东西
    coderliss
        18
    coderliss  
       2013-08-02 16:24:26 +08:00   ❤️ 1
    @leonwong 注入只是问题之一,多一个字段多一点风险罢了。
    首先是不利于扩展,怎么区分用户不存在,和用户密码错误这两种情况?
    其二是建索引影响插入性能,没必要的性能浪费
    jasontse
        19
    jasontse  
       2013-08-02 16:37:06 +08:00 via iPad   ❤️ 1
    想起了1' or 1=1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5345 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:26 · PVG 16:26 · LAX 01:26 · JFK 04:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.