版权声明:本文为博主原创文章,希望能与大家共享。 https://blog.csdn.net/dunegao/article/details/79267331
普通的select语句当查询超过10万条语句列表时速度会严重影响,下面是公司DBA写出的优化版的sql语句
<!-- 获取POIlist -->
<select id="getPoiInfoList" resultMap="PoiInfoRVO">
SELECT T.POI_ID,
T.POI_NAME,
T.X_AXIS,
T.Y_AXIS,
T.POI_STATE,
T.POI_DESC,
T.POI_ADDRESS,
T.THUMBNAIL,
T.AREA,
T.CITY,
T.POI_TYPE,
T.SALES_VOLUME,
T.ASCRIPTION
FROM T_POI_INFO T
INNER JOIN ( SELECT s.POI_ID FROM T_POI_INFO s WHERE s.DELFLAG = '0' AND s.POI_TYPE = #{poiType,jdbcType=VARCHAR} AND s.POI_STATE = #{poiState,jdbcType=VARCHAR} ORDER BY POI_ID DESC LIMIT #{begin},#{count}) f USING (POI_ID)
WHERE T.DELFLAG='0'
AND T.POI_TYPE =#{poiType,jdbcType=VARCHAR}
AND T.POI_STATE =#{poiState,jdbcType=VARCHAR}
<if test="poiName != '' and poiName != null">
AND T.POI_NAME LIKE CONCAT('%',#{poiName},'%')
</if>
<if test="area != '' and area != null">
AND T.AREA LIKE CONCAT('%',#{area},'%')
</if>
<if test="city != '' and city != null">
AND T.CITY LIKE CONCAT('%',#{city},'%')
</if>
<if test="ascription != '' and ascription != null">
AND T.ASCRIPTION =#{ascription,jdbcType=VARCHAR}
</if>
ORDER BY T.POI_ID DESC
</select>
但是进行分页是,需要查询下总条数:
<!-- 获取POIsum -->
<select id="getPoiInfoCount" resultType="int">
SELECT COUNT(T.POI_ID)
FROM T_POI_INFO T
WHERE T.DELFLAG='0'
AND T.POI_TYPE =#{poiType}
AND T.POI_STATE =#{poiState}
<if test="poiName != '' and poiName != null">
AND T.POI_NAME LIKE CONCAT('%',#{poiName},'%')
</if>
<if test="area != '' and area != null">
AND T.AREA LIKE CONCAT('%',#{area},'%')
</if>
<if test="city != '' and city != null">
AND T.CITY LIKE CONCAT('%',#{city},'%')
</if>
<if test="ascription != '' and ascription != null">
AND T.ASCRIPTION =#{ascription}
</if>
</select>
如果直接运行这条sql也会出现超过一分钟的查询时间。
目前想到的处理办法供大家借鉴,可以说不是很准确。
从业务逻辑上讲,人们翻页时一般及其有耐心的人也不会翻到100页,因此,我可以先查询第100页的数据
如果有数据,说明数据量特别大,我们就不再调取查询总计量的sql语句,默认给一个上限页数100页。就节省了查总条数的查询时间。
如果没有数据,说明数据量不大,那我们就正常执行查询总条数的sql语句。正常分页处理