記錄一次使用 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
後來深刻了解了一下這個框架,發現出現這種狀況是因爲咱們依賴的版本過低致使的; 依賴版本: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>