从这里:
In some cases, MySQL can use an index to satisfy an ORDER BY clause without doing any extra sorting.
我认为索引有助于检索特定的数据片段(如数组中的索引),在索引时会得到O(1)而不是O(n)。但在排序时,我假设他们使用任何基于排序列的O(nlogn)或某种算法,但是显然,索引排序所依据的列可以减少所涉及的工作量。
这是怎么回事?(我也不确定这是一般的SQL还是MySQL的事情)
有两种情况:
使用默认排序规则:
CREATE TABLE IF NOT EXISTS `table` (
`name` varchar(255) collate utf8_general_ci NOT NULL,
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
SELECT `name` FROM `table` ORDER BY `name`;
使用COLLATE
CREATE TABLE IF NOT EXISTS `table` (
`name` varchar(255) collate u
我使用下面的代码创建了一个表,但是显示了警告
No index defined!
我使用以下SQL命令创建表
CREATE TABLE IF NOT EXISTS `test` (
`path` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我使用以下PHP代码将多个图像路径插入数据库,但每个路径都存储在新行中,如何存储在SQL表中的单行中?
if ($_FILES) {
$upload = new Upload_Rename();
$destination = 'upload';
$paths=$u
拥有超过1 800万行的表:
SELECT * FROM tbl WHERE id > 10000000 LIMIT 30
花了0.0724秒。
SELECT * FROM tbl WHERE id < 10000000 ORDER BY id DESC LIMIT 30
花了0.0565秒。
这是在MySQL中的某一行之前选择一定数量的记录的最快方法吗?
这看起来很好,但是在选择这30行之前,MySQL不需要先按降序对这1千万行进行排序吗?
我问这是因为我对我提出的这个查询不太确定。这看起来确实很有效,而且足够快,但从语法语义来看,我不太确定。
MySQL是否有足够的智能来知道它
在MySQL中,group by做了一个隐式order by ASC。
如果您想添加一个ORDER BY ASC,这是很好的,因为结果已经被排序了。
但是,如果您想要ORDER BY .. DESC,则MySQL必须完全相反地对结果集进行排序。
会不会加快选择速度,减慢速度,或者根本不做任何事情?
SELECT field1, field2 FROM atable
GROUP BY -mydate -- group by trick to force a `group by ... desc`
ORDER BY mydate DESC
我知道我可以对代码进行计时,但我希望对当前的问题有更
我有一个包含两个整数列的主键的表。我在这张桌子上存了2亿行。我的程序需要获得由主键的列按相同顺序排序的完整表。
所以,我的查询看起来像Select * from MYTABLE order by PK1,PK2;
我注意到,查询没有立即发送数据,而是在“排序结果”状态下花费了大量时间。我认为mysql将使用主键索引以所需的顺序直接访问数据。但是,它似乎没有顺序地扫描它,然后对数据进行排序。
是否有可能改变行为并提高查询的效率?
备注:我尝试过使用MySQL5.5和mariadb10.2。
以下是一些有用的信息(我试图用索引列和非索引列解释一些订单,并给出相同的结果)。
mysql> sh
在mysql中,"ORDER BY“或"WHERE”后的字段可能有索引(PRIMARY,UNIQUE,INDEX)?
考虑一个包含以下列的表:
ID | AddedDate | CatID | Title | Description | Status | Editor
在这些查询中,ID、AddedDate和CatID是否可能有索引?
SELECT *
FROM table WHERE ID = $id
SELECT *
FROM table
ORDER BY ID
SELECT *
FROM table
ORDER BY Ad
我有一个表,其中包含以下字段: userid、logintime、birthdate
我需要让所有的用户在生日X和Y与最近登录的第一个排序。
SELECT *
FROM table
WHERE birtdate BETWEEN x AND Y
ORDER BY logintime DESC
如果我只在birtdate上定义了一个索引,mysql将使用filesort对结果进行排序,这是我想要避免的(表越来越大,查询越来越流行)。
定义一个索引( logintime,birthdate)对我来说没有意义,因为logintime甚至不在WHERE子句中(我只通过birthdate限制结果集)
网上已经有很多帖子了,只是想弄明白一些让我困惑的细微之处!
引用
如果将限制row_count与ORDER相结合,MySQL在找到排序结果的第一个row_count行后就停止排序,而不是对整个结果进行排序。如果使用索引进行排序,这是非常快的。
与
它将首先订购,然后得到前20。数据库还将处理WHERE子句中的任何内容。
从问题中提取相同的查询:
SELECT article
FROM table1
ORDER BY publish_date
LIMIT 20
假设表有2000行,其中query将返回20行,现在,查看mysql ....stops sorting as so
我刚刚将一台MySQL 5.0服务器升级到MySQL 5.5,发现之前工作的存储例程已经崩溃。不同之处: MySQL 5.5似乎以任意顺序INSERT行。因此,在下面的代码中,ORDER BY子句没有任何效果。AFAIK,在MySQL 5.0中曾经有过。
INSERT INTO MyTable
SELECT * FROM MyOtherTable ORDER BY Col1, Col2 DESC;
人们说,根据定义,INSERT中的:在使用表中的ORDER BY时只需使用SELECT。问题是我使用游标来循环表和执行复杂的操作。当然,我可以将ORDER BY语句放在游标定义中:
DECLARE
我通过MySQL PDO获取数据数组:
"select * from table"
在查询中使用函数排序是否更快,例如
"select * from table order by key"
与直接的mysql顺序查询相比,使用PHP usort或任何其他数组排序会牺牲很大的效率吗?
$prepare=$database->prepare("select * from table");
$prepare->execute();
$fetch=$prepare->fetchall(PDO::FETCH_ASSOC);
usort(
我有一个表格'posts‘和一个列’热‘(reddit算法)。“热”是十进制: XXXXX,XXXXXXX
这是我的疑问:
SELECT * FROM posts ORDER BY hot DESC
现在,我希望这个查询使用一个索引来表示“热”。我试过了
ADD INDEX hot_index(hot)
文章中的显示索引告诉我,这个索引确实是创建的。
但是,当我在查询之前使用“解释”运行查询时,我可以看到MySQL没有使用索引进行排序。为什么?我怎么才能改变呢?
非常感谢!
我已经将pdf文档上传到mysql数据库。但是,当上传按字母表顺序排列的列名数据排序技术时,我并没有特别注意。然后,我想排序的数据在字母pdf文件,以便索引。
$sql="SELECT * FROM upload ORDER BY name ASC";
我的问题是,如何能够按字母顺序对列名中的记录进行排序,字母表和id列也可以从数字1开始排序?该怎么做呢?
这是我的源代码:
<tr>
<td>No. </td>
<td>File Name</td>
<td>File Type</td>
<
假设在tableX中我们有id(主键) name和age、phone,它们都带有索引。
在这个查询中:select phone from tableX where name='Dennis' order by age
我想这个过程是
使用name索引获取与Dennis匹配的ids。表示S设置的id
L 使用age索引对在1中获得的id进行排序,得到一个排序的id列表,由表示
phone 使用排序后的id list L来获取
我假设在步骤2中,它可以使用沿B+树叶节点的顺序扫描,检查该叶节点中的id是否在步骤1中获得的id集S中。如果是,将其添加到list L中,那么我们可以得到
我正在尝试解决MySQL上的一个性能问题,所以我想创建一个较小版本的表来使用。当我向查询添加一个LIMIT子句时,它从大约2秒(对于完整插入)变为天文数字(42分钟)。
mysql> select pr.player_id, max(pr.insert_date) as insert_date from player_record pr
inner join date_curr dc on pr.player_id = dc.player_id where pr.insert_date < '2012-05-15'
group by pr.player_id;
+-
在按排序顺序排列的列上创建索引是否提高了性能?对于Mysql、Postgresql和Oracle数据库,我需要知道这一点。
例如,查询:
select * from article_comments where article_id = 245 order by date_created desc limit 30;
在article_comments表中,article_id是一个索引字段,而date_created不是索引字段。如果我们在date_created上创建一个索引,它会提高性能吗?表的大小约为500万至700万行。
mysql-5.6.24-win32.1432006610
我有两个用于用户消息的表。
TMessageBody (id, body)存储消息体。
TMessage (id, uid, folderId, msgBodyId, subject)将用户的消息存储在文件夹中,如收件箱、发件箱。
创建表SQL
create table TMessageBody (
id int unsigned not null primary key auto_increment,
body text not null
我使用的是MySQL,我有一个数据库,我试图使用它作为数据的规范版本,我将存储在不同的索引中。这意味着我必须能够通过主键快速地从其中检索一组数据,但我还需要在输出时对其进行排序。我不知道如何让MySQL高效地做到这一点。
我的桌子看起来如下:
CREATE TABLE demo.widgets (
id INT AUTO_INCREMENT,
-- lots more information I need
awesomeness INT,
PRIMARY KEY (id),
INDEX IDX_AWESOMENESS (awesomeness),
我有一张MySQL桌:
CREATE TABLE mytable (
id INT NOT NULL AUTO_INCREMENT,
other_id INT NOT NULL,
expiration_datetime DATETIME,
score INT,
PRIMARY KEY (id)
)
我需要以以下形式运行查询:
SELECT * FROM mytable
WHERE other_id=1 AND expiration_datetime > NOW()
ORDER BY score LIMIT 10
如果我将此索引添加到m
我正在尝试从两个mysql表中获取数据,并按日期排列它们。这两个表涉及收入和支出。我试图实现的是首先显示来自收入表的数据,然后显示支出表中日期为15/04/2014的数据,然后再次循环下一个日期,并显示与收入表中的16/04/14相关的数据,然后显示支出表中的数据。目前的代码循环了所有次数的no。收入表中条目的数量。如何纠正这一点?代码如下:
<?php
include "connection.php";
?>
<table width="100%" border="1" align="center" cel
使用将表的全部内容从Server复制到MySQL计算机上的相同表中。MySQL数据库使用MySQL ODBC5.1驱动程序作为链接服务器连接到Management。使用一个简单的语句很好,但是执行非常慢。
INSERT INTO openquery(MYSQL, 'select * from Table1')
SELECT * from MSSQL..Table2
我有一张约有45万张唱片的桌子,转机只需5个多小时。这是正常的吗?我以前没有链接MySQL服务器的经验。