記錄一次使用 PageHelper 插件進行分頁的糟糕體驗

記錄一次使用 PageHelper 插件進行分頁的糟糕體驗mysql

在一次服務上線後,進行驗證時發現其中一個頁面加載異常的緩慢,當時並無意識到是SQL的問題; 後來運維組梳理統計慢SQL時將某一個SQL語句發給我,讓我進行優化;git

語句以下:github

SELECT COUNT(0)
FROM (
	SELECT id, gmt_create, gmt_modify, order_no,···
	FROM xxxlog
	WHERE payment_time >= '2018-10-08 09:55:33'
		AND corp_no IN ('3702040001', '3702040002', )
	ORDER BY payment_time DESC
) tmp_count;
select id, gmt_create, gmt_modify, order_no,···
from (SELECT id, gmt_create, gmt_modify, order_no,···
    FROM xxxlog
    WHERE payment_time >= ? and corp_no in (  ? , ? )
    order by payment_time desc) as tmp_page
limit 0,10

What ? What ? What ? 咱們系統的xxxlog表中有超過千萬的數據量,直接使用這樣方式的SQL進行分頁,不是瘋了嗎!!!spring

檢查系統代碼後,並無發現mapper中有這樣的SQL語句,忽然想起系統好像重構後使用了一種分頁插件,會不會是分頁插件默認添加的呢? debug發現,沒錯,是他就是他,PageHelper默認將分頁語句拼裝成了那樣的SQL;sql

結論:框架拿來就用是有風險的,須要評估後使用。mybatis

PS

後來深刻了解了一下這個框架,發現出現這種狀況是因爲咱們依賴的版本過低致使的; 依賴版本:app

<dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>3.2.3</version>
        </dependency>

MyBatis配置框架

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis-config.xml" />
        <property name="mapperLocations" value="classpath:mapper/**/*Mapper.xml" />
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageHelper">
                    <property name="properties">
                        <value>
                            dialect=mysql
                            pageSizeZero=true
                            reasonable=true
                        </value>
                    </property>
                </bean>
            </array>
        </property>
    </bean>
相關文章
相關標籤/搜索