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

MySQL 单表 2000 万条数据, 如何提高 筛选查询 和 多用户并发查询 的性能 ?

  •  
  •   RickyC · 2020-09-15 14:20:16 +08:00 · 3397 次点击
    这是一个创建于 1515 天前的主题,其中的信息可能已经有所发展或是发生改变。
    MySQL 单表 2000 万条数据, 如何提高 筛选查询 和 多用户并发查询 的性能 ?
    网上有没有 Step by Step 的详细教程?
    使用 PHP 语言, 我以前也只有 PHP 等经验, 没有大数据处理经验.
    24 条回复    2020-09-21 13:32:48 +08:00
    fhsan
        1
    fhsan  
       2020-09-15 14:23:06 +08:00
    读写分离,联合索引、字段冗余、缓存常用数据,可以应付
    和 php 没啥关系,2000 万不算啥大数据
    RickyC
        2
    RickyC  
    OP
       2020-09-15 14:40:13 +08:00
    哎, 哪里有教程...
    aimaodeyuer
        3
    aimaodeyuer  
       2020-09-15 15:16:45 +08:00
    2000w 也不是很大的数据量,如果查询条件不是特别多,建立合理的索引也能 hold 住。如果条件筛选太多,没办法建索引的话就往 es 同步一份数据,查询都走 es 。
    sadfQED2
        4
    sadfQED2  
       2020-09-15 15:24:42 +08:00 via Android
    才 2000 万数据,你看下慢日志,然后合理连索引就能搞定。再不行就升级机器,固态加上,内存加大,带宽加宽。。。。


    最后的最后,实在不行了再考虑楼上说的,加 es,读写分离啥的
    baiduyixia
        5
    baiduyixia  
       2020-09-15 15:45:22 +08:00
    @RickyC 看我名字
    guruiqin
        6
    guruiqin  
       2020-09-15 15:48:54 +08:00
    简单一点可以使用 mysql 分区(具体按照用户注册时间 或者其他进行分区)
    这样如果查询覆盖分区的话那么数据量会少很多
    RickyC
        7
    RickyC  
    OP
       2020-09-15 15:51:52 +08:00
    @baiduyixia 两条腿走, 一直在百度, 谢谢
    noahsophie
        8
    noahsophie  
       2020-09-15 16:08:58 +08:00
    建议把问题具体化再去搜索,有针对性的搜索,这样提问题很难有合适的回答~
    wysnylc
        9
    wysnylc  
       2020-09-15 16:10:37 +08:00
    @baiduyixia #5 哈哈哈哈
    someonedeng
        10
    someonedeng  
       2020-09-15 16:18:06 +08:00
    有时候加个索引就能解决问题了,2000 不算非常大,但是 mysql 不建议这么大一个表吧= =,实在不行再分个区分个表啥的
    kiracyan
        11
    kiracyan  
       2020-09-15 16:30:09 +08:00
    2000 万慢的话不是没加索引就是单行数据过大吧
    opengps
        12
    opengps  
       2020-09-15 22:51:35 +08:00 via Android
    第一步,硬盘够快,物质基础才是第一步
    第二步,简化查询条件,让查询尽可能都按照预期的索引执行
    要并发查询,用多个实例进行读写分离
    594duck
        13
    594duck  
       2020-09-16 06:15:38 +08:00 via iPhone
    2000 万行,先看索引,在看查询一次要扫描多少行。

    你的 mysql 什么配置,配置太低也不行。
    butterfly1211
        14
    butterfly1211  
       2020-09-16 09:06:06 +08:00
    数据库中间件
    zpfhbyx
        15
    zpfhbyx  
       2020-09-16 09:30:16 +08:00
    @someonedeng 2000w 没必要上分区 分表吧。。现在的表 2c4G 下扛个大几 kw 没啥问题啊
    someonedeng
        16
    someonedeng  
       2020-09-16 09:52:45 +08:00
    @zpfhbyx 我手头上有个 1000 万没分的,某天瞄一眼变成 1 亿了 = =,不过这个还是得看做的什么,有些业务并不是对查询时间这么敏感,具体情况具体分析嘛
    wangritian
        17
    wangritian  
       2020-09-16 11:35:21 +08:00
    吃透索引,亿级以内的数据查询很容易搞定,除非你只有 like %...%这一个条件
    推荐一下极客时间的 mysql 实战 45 讲,非利益相关,纯粹觉得写的好
    AmberJiang
        18
    AmberJiang  
       2020-09-16 15:43:26 +08:00
    2000 万还好吧 建议可以做索引
    RickyC
        19
    RickyC  
    OP
       2020-09-21 11:06:17 +08:00
    @fhsan
    @aimaodeyuer
    @sadfQED2
    @guruiqin
    @noahsophie
    @wysnylc
    @someonedeng
    @kiracyan
    @opengps
    @594duck
    @butterfly1211
    @zpfhbyx
    @someonedeng
    @wangritian
    @AmberJiang

    感谢各位, 目前通过添加一个联合索引, 提高了查询性能; 将查询速度从 8 秒提高到了大约 0.8 秒

    目前还有一个问题, 就是并发的问题

    假如很多用户同时进行相同的查询, 每个网页的打开速度还在 8 秒左右

    20 进程测试:如果是不同查询, 性能就好; 如果是相同查询, 性能就差

    所以各位有什么解决方法吗?
    kiracyan
        20
    kiracyan  
       2020-09-21 11:25:32 +08:00
    @RickyC 相同查询很慢? 不同查询很快?
    RickyC
        21
    RickyC  
    OP
       2020-09-21 11:30:14 +08:00
    @kiracyan

    20 线程测试

    不同查询每线程用时在: 301-1660 毫秒

    相同查询每线程用时在: 6833-8454 毫秒
    kiracyan
        22
    kiracyan  
       2020-09-21 11:54:32 +08:00
    @RickyC 你试试在数据库客户端直接运行这 20 条 SQL 要多久
    opengps
        23
    opengps  
       2020-09-21 12:09:35 +08:00 via Android
    数据库连接池配置了吗?
    wangritian
        24
    wangritian  
       2020-09-21 13:32:48 +08:00
    @RickyC 并发测试的同时,观察一下 php 机器和 mysql 机器的 cpu 、内存、磁盘 IO 、网络 IO,可能的原因比较多,先排查一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2536 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:34 · PVG 09:34 · LAX 17:34 · JFK 20:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.