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
css3
V2EX  ›  MySQL

一个有 78 万数据的 mysql 表,创建索引 2 个小时了,还是未完成创建,是哪里不正常吗?

  •  
  •   css3 · 2020-04-08 19:31:01 +08:00 · 7814 次点击
    这是一个创建于 1714 天前的主题,其中的信息可能已经有所发展或是发生改变。

    productName 列创建索引,创建前这个表已经有 78 万条数据

    mysql> select count(id) from products;
    +-----------+
    | count(id) |
    +-----------+
    |    780097 |
    +-----------+
    
    
    | products | CREATE TABLE `products` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `productCode` text NOT NULL COMMENT '产品代码',
      `productName` text NOT NULL COMMENT '产品名称',
      `productLine` text NOT NULL COMMENT '产品线',
      `productScale` text NOT NULL,
      `productVendor` text NOT NULL,
      `productDescription` text NOT NULL,
      `quantityInStock` smallint(6) NOT NULL COMMENT '库存',
      `buyPrice` decimal(10,2) NOT NULL COMMENT '价格',
      `MSRP` decimal(10,2) NOT NULL COMMENT '建议零售价',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=760001 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC |
    

    创建索引命令(卡这 2 个多小时了😱,这是在创建中还是已经凉了??):

    mysql> create index product_index on products (productName(64));
    
    
    
    第 1 条附言  ·  2020-04-09 09:24:49 +08:00

    回复一下各位,仅仅是自学测试一下,不是实际项目当中,所以字段定义确实不严谨😂

    索引也创建完了,耗时7个多小时

    Query OK, 780097 rows affected (7 hours 19 min 11.69 sec)
    
    44 条回复    2020-04-10 09:59:04 +08:00
    qiayue
        1
    qiayue  
       2020-04-08 19:38:28 +08:00
    productName 是 text 类型?大部分几个字符?
    另外产品名称建所以没多大意义吧?
    jugelizi
        2
    jugelizi  
       2020-04-08 19:38:38 +08:00 via iPhone
    稳妥的方案是新建临时表带索引 导入数据再覆盖原始的
    xcstream
        3
    xcstream  
       2020-04-08 19:42:30 +08:00
    text 类型 有点大
    privil
        4
    privil  
       2020-04-08 19:44:54 +08:00
    再开一个连接看看执行状态啊
    css3
        5
    css3  
    OP
       2020-04-08 19:46:21 +08:00
    @qiayue 10240 个字符😥,很长,编译器都卡顿
    version
        6
    version  
       2020-04-08 19:47:52 +08:00
    productName 索引不能用 text 呢.
    而且用 VARCHAR 建立索引 200 字符长度以上都直接报错呢
    VARCHAR(30) 以内都很大了.
    而且字符串做索引.本来性能就不算好.
    yjxjn
        7
    yjxjn  
       2020-04-08 19:48:31 +08:00
    @qiayue code 为啥也是 text 类型???不是 number 么
    Egfly
        8
    Egfly  
       2020-04-08 19:51:29 +08:00
    这索引没啥意义吧。不如上 es
    xuanbg
        9
    xuanbg  
       2020-04-08 19:53:06 +08:00
    text 类型的字段不适合直接做索引。。。一般这种内容我都用 es 做索引,查到 id 后再读数据库。
    yangbin9317
        10
    yangbin9317  
       2020-04-08 19:53:57 +08:00
    因为 Innodb 的没有确定的哈希索引,只有自适应哈希索引,我觉得可以建一个字段叫 hash 里面存 text 的 hash,然后在 hash 上建索引(因为 hash 比较短)查询的时候先判断 hash,hash 一样再判断 text 。
    qiayue
        11
    qiayue  
       2020-04-08 19:58:55 +08:00
    10240 个字符
    这么长建索引干嘛?你想做搜索?
    不是这样干的
    glacer
        12
    glacer  
       2020-04-08 19:59:57 +08:00
    show processlist 看下是不是链接状态是 waiting for metalock
    sjzzz
        13
    sjzzz  
       2020-04-08 20:23:11 +08:00
    .....为什么全是 text 。这表设计的很有问题啊
    jay4497
        14
    jay4497  
       2020-04-08 20:49:43 +08:00
    不知道你磁盘空间有没有剩余有 50%+,如果没有的话,有可能是空间不足的问题。。。
    wangyzj
        15
    wangyzj  
       2020-04-08 21:28:48 +08:00
    全是 text
    text 做索引。。。。咋想的
    kiracyan
        16
    kiracyan  
       2020-04-08 21:32:23 +08:00
    这数据库设计的也是绝了
    mumbler
        17
    mumbler  
       2020-04-08 21:34:26 +08:00 via Android
    啥产品啊,名称要用 text
    ArJun
        18
    ArJun  
       2020-04-08 21:35:21 +08:00
    索引千万条,但是绝不能用 text 做索引
    ytmsdy
        19
    ytmsdy  
       2020-04-08 21:36:43 +08:00
    大哥你 productDescription 用 text 类型表示理解,但是为什么 productCode,productName,productLine 也用 text ?
    metrxqin
        20
    metrxqin  
       2020-04-08 23:21:21 +08:00 via Android
    竟然用 MYISAM 引擎,你怎么保证库存数据一致性的?
    ragnaroks
        21
    ragnaroks  
       2020-04-09 00:19:48 +08:00
    槽点太多,就说一个,价格应该使用最低计量单位做缩放,而不是使用"高精度"类型;

    10 元 8 角 7 分,正确的存储方式应该是 1087 分,而不是 10.87 元
    swulling
        22
    swulling  
       2020-04-09 02:36:03 +08:00 via iPhone
    这个表结构很惊人,这么多字段里面,我看也就两个字段是设置合理的。
    tsui
        23
    tsui  
       2020-04-09 06:44:09 +08:00
    @ragnaroks “正确的存储方式应该是 1087 分,而不是 10.87 元”
    你这是把 Java 里头用 Big Decimal 跟 MySQL 弄混了吧?这个估计是少数这个 schema 没错的地方了。

    https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html
    The DECIMAL and NUMERIC types store exact numeric data values.
    sadfQED2
        24
    sadfQED2  
       2020-04-09 08:12:35 +08:00   ❤️ 4
    我看到这个表的心情就是楼主的头像
    starcraft
        25
    starcraft  
       2020-04-09 08:38:14 +08:00
    你这个 create 语句实在槽点太多。
    SjwNo1
        26
    SjwNo1  
       2020-04-09 08:50:16 +08:00
    text 太大,可以但没必要
    b821025551b
        27
    b821025551b  
       2020-04-09 09:05:15 +08:00
    @ragnaroks #21 用 decimal 不算错误,在数据库层面是完全没问题的,只是应用层要稍微注意而已。(虽然我也用 int )
    Ianchen
        28
    Ianchen  
       2020-04-09 09:23:22 +08:00
    没用过 MyISAM 引擎, 这个引擎能在 text 上建索引吗? 不会报错?
    scnace
        29
    scnace  
       2020-04-09 09:43:03 +08:00 via Android
    给这种字段加索引 建议加一个 hash(ProductName)的新字段 然后给这个字段加索引
    toxicant
        30
    toxicant  
       2020-04-09 09:45:45 +08:00
    你这个头像和标题,绝配
    nanguaboy
        31
    nanguaboy  
       2020-04-09 10:12:58 +08:00
    这个 text 类型不能理解
    marcushbs
        32
    marcushbs  
       2020-04-09 10:37:53 +08:00
    ORM 可以有效避免初学者 create table 时的随意,熟练之后当然随便手写
    zencoding
        33
    zencoding  
       2020-04-09 10:42:25 +08:00
    DBA: 把写 DDL 的人拉出去枪毙 5 分钟
    iceecream
        34
    iceecream  
       2020-04-09 10:58:39 +08:00
    咋全是 text ?
    text 这种不是 mysql 的强项,换 Es 比较快
    crist
        35
    crist  
       2020-04-09 11:15:28 +08:00
    文字都是 text 类型,LZ 也是牛逼!
    jjianwen68
        36
    jjianwen68  
       2020-04-09 11:23:52 +08:00
    网上搜一下 db 的最佳实践学习学习
    xpresslink
        37
    xpresslink  
       2020-04-09 11:27:37 +08:00
    @crist 估计楼主是从 sqlite 转过来的。
    ArtIsPatrick
        38
    ArtIsPatrick  
       2020-04-09 12:16:08 +08:00 via iPhone
    建议重新建表,好好设计一下字段类型
    huayumo
        39
    huayumo  
       2020-04-09 12:23:36 +08:00
    哈哈哈,做测试的,这字段也够牛逼的,从来不敢想,
    jon
        40
    jon  
       2020-04-09 16:11:36 +08:00
    你怎么自学的这字段太惊悚了
    sdot96
        41
    sdot96  
       2020-04-09 19:41:01 +08:00 via Android
    换数据库引擎,然后建全文索引啊
    EminemW
        42
    EminemW  
       2020-04-10 01:33:58 +08:00
    @b821025551b 应用层应该用啥,我用的是 Big Decimal
    zhuzhibin
        43
    zhuzhibin  
       2020-04-10 09:30:41 +08:00 via iPhone
    卡死应该是因为建立索引 mysql 进程卡死了
    daya
        44
    daya  
       2020-04-10 09:59:04 +08:00
    你们已经把楼主吓得换头像了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4973 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 03:52 · PVG 11:52 · LAX 19:52 · JFK 22:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.