我的表中有22,000个条目,因此我在显示表时使用了limit
,然后用户可以定义要显示的行数:
我的问题是,即使我键入较小的数字(如10),它也只显示10个条目,但每行加载我的整个表行,加载时间将近30秒。
$rpp = 10;
$page = 1;
$temp = ($page-1)*$rpp;
$query = " SELECT * FROM table_me ORDER by date_sourced desc LIMIT $temp, $rpp ";
$page_result = mysqli_query($conn, $query);
我尝试了此操作,并按照说明进行操作,但这无法正常工作,并给我错误:SELECT TOP 300 * FROM table_me LIMIT 0, 25
$query = " SELECT TOP 300 * FROM table_me ORDER by date_sourced desc LIMIT $temp, $rpp ";
如何仅从表中加载300,但仍然可以访问表中的其余最低值?
然后这是我的代码,用于从表中回显值:
<?php while($row = mysqli_fetch_assoc($page_result)) { $currsamp_id = $row['id'];?>
<tr>
<td><input class="ui checkbox" type="checkbox" name="check_box" value="<?php echo $row['id'] ?>"></td>
<td onclick="$('#options_<?php echo $currsamp_id ?>').dropdown('show')" style="overflow: visible !important;">
<div class="ui dropdown item" id="options_<?php echo $currsamp_id ?>">
<i class="settings icon"></i><i class="dropdown icon"></i>
<div class="menu">
<?php
if(isset($_SESSION['username'])) {
$temp = $row['id'];
$ds = $row['date_sourced']; $sh = $row['sha1']; $vsdt = $row['vsdt']; $tx = $row['trendx']; $n = str_replace('\"', '\\\"', $row['notes']);
echo "<a class='item' style='color: black; width: 100%;' onclick='open_update(\"" . $temp . "\", \"" . $ds . "\", \"" . $sh . "\", \"" . $vsdt . "\", \"" . $tx . "\", \"" . $n . "\")'>Update</a>";
} else {
echo '<a class="item modal_trigger" style="color: black; width: 100%;" data-target="#modal_login">Update</a>';
}
?>
<?php
if(isset($_SESSION['username'])) {
$temp = $row['id']; $sha1 = $row['sha1'];
echo '<a class="item" style="color: black;" onclick="open_delete(\''.$temp.'\', \''.$sha1.'\', \'open\')">Delete</a>';
} else {
echo '<a class="item modal_trigger" style="color: black;" data-target="#modal_login">Delete</a>';
}
?>
</div>
</div>
</td>
<td nowrap title="Date Sourced"><?php echo $row['date_sourced'] ?></td>
<td nowrap title="SHA-1"><?php echo $row['sha1'] ?></td>
<td nowrap title="VSDT"><?php echo $row['vsdt'] ?></td>
<td nowrap title="TrendX"><?php echo $row['trendx'] ?></td>
<td nowrap title="Notes"><?php echo $row['notes'] ?></td>
</tr>
<?php } ?>
答案 0 :(得分:1)
如评论中所述,您正在混合来自两个不同DBMS的语法。
对于 mysql ,请使用LIMIT
,而不要使用TOP
。另外,LIMIT
只有一个参数,没有两个。
这是您更正的查询:
$query = " SELECT * FROM table_me ORDER BY date_sourced DESC LIMIT 100 ";
这将仅返回前100行。
答案 1 :(得分:1)
此外-如果您需要快速找到前十名date_sourced
, ,则应在该列上创建索引。
否则,是的,DBMS别无选择,只能扫描整个表,找到最上面的条目,然后再将这些行的第一个 n 提供给您!
在存在索引的情况下,这样的查询实际上是瞬时的。
答案 2 :(得分:0)
我将其作为另一个“答案” ...
使用EXPLAIN
动词查看RDBMS如何运行查询,例如,:
EXPLAIN SELECT * FROM table_me ORDER BY date_sourced DESC LIMIT 100
这将为您提供所谓的“执行计划”,这实际上是驱动查询引擎的原因。 (RBMS“编译” SQL,考虑各种统计信息,并提出一个计划。它针对每个查询执行此操作。)
EXPLAIN
使RDBMS将计划退还给您,而不是随后执行该计划。这可以准确地告诉您RDBMS 如何来获取想要的答案。
如果查询运行“异常缓慢”,这是找出原因的好方法。 (计划数据的格式从一个RDBMS到另一个RDBMS差别很大。)