【发布时间】:2018-01-16 22:05:45
【问题描述】:
您好,我在我的应用程序中使用 Angular js 进行分页,我将数据发送到包含用户设置的过滤器的大查询
更新 SQL_CALC_FOUND_ROWS 这是我的问题。如何计算特定过滤器的行数。 100,000 行花了我 2 秒我需要分页的数字作为总数
更新: 我在这里错过了以下内部查询:
(select count(*) from students as inner_st where st.name = inner_st.name) 作为名字,
当我删除上面的内部查询时要快得多
行数:50,000 用户表:4行 类表:4行 索引:只有 id 作为主键
查询时间20-40秒
tables: students.
columns : id, date ,class, name,image,status,user_id,active
table user
coloumn: id,full_name,is_admin
查询
SELECT SQL_CALC_FOUND_ROWS st.id,
st.date,
st.image,
st.user_id,
st.status,
st,
ck.name AS class_name,
users.full_name,
(select count(*) from students AS inner_st where st.name = inner_st.name) AS names,
FROM students AS st
LEFT JOIN users ON st.user_id = users.user_id
LEFT JOIN classes AS ck ON st.class = ck.id
WHERE date BETWEEN '2018-01-17' AND DATE_ADD('2018-01-17', INTERVAL 1 DAY)
AND DATE_FORMAT(date,'%H:%i') >= '00:00'
AND DATE_FORMAT(date,'%H:%i') <= '23:59'
AND st.active=1
-- here I can concat filters from web like "and class= 1"
ORDER BY st.date DESC
LIMIT 0, 10
我怎样才能让它更快?当我删除订单时,SQL_CALC_FOUND_ROWS 会更快,但我需要它们 我听说过索引,但只有主键是索引
【问题讨论】:
-
如果不知道表中有多少行,哪些列被索引,很难判断。
-
@JoeP。 hi - id 作为主键和 50000 行
-
添加
st的别名。告诉我们额外的过滤器列将在哪些表中。(它在优化方面有很大的不同。)请提供SHOW CREATE TABLE。 -
@RickJames 我已经更新了我有另一个内部查询的问题,当我更快地删除它时,我该如何索引? (select count(*) from students as inner_st where st.name = inner_st.name) 作为名字,
-
1.将所有联接转换为内部联接。 2.对student表中的user_id、class、date进行索引。