douhan6738 2013-05-10 14:34
浏览 44
已采纳

这个mysql插件可以加速吗?

This insert is a part of my application that allows the user to take photos and store them in the database. There's a pretty specific naming convention for all the filenames being stored in the database, which is why my insert has such intense case statements. I'm guessing this has something to do with my slow performance. When inserting new shots for a patient with very few, or no, shots stored in the database, my application runs much faster. However, if the patient I'm adding shots to has already has a lot stored in the database, the performance is much slower.

Is it possible to speed up this insert statement? If so, how? My app is coded in PHP and I'm using phpMyAdmin and mysqli

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
  • 写回答

2条回答 默认 最新

  • doucheng1944 2013-05-10 14:43
    关注

    It will propably be faster but at least a lot shorter.. Why use cases when you can use 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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 matlab实现基于主成分变换的图像融合。
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊