【问题标题】:Can this mysql insert be sped up?这个mysql插入可以加速吗?
【发布时间】:2013-05-10 22:43:04
【问题描述】:

这个insert 是我的应用程序的一部分,它允许用户拍照并将它们存储在数据库中。存储在数据库中的所有文件名都有一个非常具体的命名约定,这就是为什么我的插入具有如此强烈的case 语句的原因。我猜这与我的表现缓慢有关。当为patient 插入新的shots 时,数据库中存储的shots 很少或没有,我的应用程序运行得更快。但是,如果我添加的patient shots 已经有很多存储在数据库中,那么性能会慢很多。

是否可以加快insert 语句的速度?如果是这样,怎么做?我的应用程序是用 PHP 编码的,我使用的是 phpMyAdminmysqli

INSERT INTO shot (ID, VISIT_ID, PATIENT_ID ,IMG_FILENAME ,SHRUNK_IMG_FILENAME ,SUBDIR ,SUBSUBDIR ,IMG_FILE_FORMAT ,EYE)
SELECT (
        SELECT (max(ID) + 1)  FROM SHOT
        )
      ,(
        SELECT max(ID)  FROM visit  WHERE visit.patient_id = " . $_SESSION['id'] ."
        )
    ," . $_SESSION['id'] . "
    ,(
        SELECT CASE 
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 100
                    THEN CONCAT ( '00000000' ,(MAX(shot.ID) + 1) ,'r.jpg' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 1000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 99
                    THEN CONCAT ( '0000000' ,(MAX(shot.ID) + 1) ,'r.jpg' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 10000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 999
                    THEN CONCAT ( '000000' ,(MAX(shot.ID) + 1) ,'r.jpg' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 100000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 9999
                    THEN CONCAT ( '00000' ,(MAX(shot.ID) + 1) ,'r.jpg' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 1000000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 99999
                    THEN CONCAT ( '0000' ,(MAX(shot.ID) + 1) ,'r.jpg' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 10000000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 999999
                    THEN CONCAT ( '000' ,(MAX(shot.ID) + 1) ,'r.jpg' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 100000000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 9999999
                    THEN CONCAT ( '00' ,(MAX(shot.ID) + 1) ,'r.jpg' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 1000000000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 99999999
                    THEN CONCAT ( '0' ,(MAX(shot.ID) + 1) ,'r.jpg' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 10000000000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 999999999
                    THEN CONCAT ( (MAX(shot.ID) + 1) ,'r.jpg' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 100000000000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 9999999999
                    THEN CONCAT ( (MAX(shot.ID) + 1) ,'r.jpg' )
            END
            )
    ,(
        SELECT CASE 
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 100
                    THEN CONCAT ( '00000000' ,(MAX(shot.ID) + 1) ,'s.bmp' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 1000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 99
                    THEN CONCAT ( '0000000' ,(MAX(shot.ID) + 1) ,'s.bmp' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 10000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 999
                    THEN CONCAT ( '000000' ,(MAX(shot.ID) + 1) ,'s.bmp' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 100000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 9999
                    THEN CONCAT ( '00000' ,(MAX(shot.ID) + 1) ,'s.bmp' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 1000000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 99999
                    THEN CONCAT ( '0000' ,(MAX(shot.ID) + 1) ,'s.bmp' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 10000000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 999999
                    THEN CONCAT ( '000' ,(MAX(shot.ID) + 1) ,'s.bmp' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 100000000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 9999999
                    THEN CONCAT ( '00' ,(MAX(shot.ID) + 1) ,'s.bmp' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 1000000000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 99999999
                    THEN CONCAT ( '0' ,(MAX(shot.ID) + 1) ,'s.bmp' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 10000000000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 999999999
                    THEN CONCAT ( (MAX(shot.ID) + 1) ,'s.bmp' )
            WHEN ( SELECT MAX(shot.ID) + 1 FROM shot ) < 100000000000
                    AND ( SELECT MAX(shot.ID) + 1 FROM SHOT ) > 9999999999
                    THEN CONCAT ( (MAX(shot.ID) + 1) ,'s.bmp' )
            END
        )
    ,$SUB
    ,$ISUB
    ,'124'
    ,'0'
FROM SHOT

【问题讨论】:

标签: php optimization insert mysqli


【解决方案1】:

它可能会更快,但至少会短很多。为什么可以使用 LPAD 的用例?

INSERT INTO shot (ID, VISIT_ID, PATIENT_ID ,IMG_FILENAME ,SHRUNK_IMG_FILENAME ,SUBDIR ,SUBSUBDIR ,IMG_FILE_FORMAT ,EYE)
SELECT 
    x.ID + 1,
    (
        SELECT max(ID)  FROM visit  WHERE visit.patient_id = " . $_SESSION['id'] ."
    ),
    " . $_SESSION['id'] . ",
    CONCAT (LPAD(MAX(x.ID) + 1, 10, 0), 'r.jpg'),
    CONCAT (LPAD(MAX(x.ID) + 1, 10, 0), 's.bmp'),
    $SUB,
    $ISUB,
    '124',
    '0'
FROM SHOT x

【讨论】:

  • 以前从未使用过 LPAD,或者至少在学校不记得它了。我的表现并不快,至少不明显。但至少我的查询要短得多。我想我得寻找其他影响我表现的东西了。
【解决方案2】:

lpad(MAX(shot.ID) + 1, 10, '0') 替换那些巨大的case 语句就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    相关资源
    最近更新 更多