我有一个表用户有一堆索引.其中一个是AccountIdentifier列的唯一索引.
由于这是一个唯一索引,为什么除了索引查找之外还需要键查找?索引查找工具提示报告只返回一条记录.我也尝试将索引转换为"唯一键"类型.
alt text http://s3.amazonaws.com/brandonc.baconfile.com/pitchurs/tmp/capture_2.png
在SQLite中,给出了这个数据库模式
CREATE TABLE observations (
src TEXT,
dest TEXT,
verb TEXT,
occurrences INTEGER
);
CREATE UNIQUE INDEX observations_index
ON observations (src, dest, verb);
Run Code Online (Sandbox Code Playgroud)
每当有一个新的观察元组(:src, :dest, :verb)出现时,我想要为该元组的现有行增加"出现次数"列,或者如果还没有,则添加一个出现次数= 1的新行.在具体的伪代码中:
if (SELECT COUNT(*) FROM observations
WHERE src == :src AND dest == :dest AND verb == :verb) == 1:
UPDATE observations SET occurrences = occurrences + 1
WHERE src == :src AND dest == :dest AND verb == :verb
else:
INSERT INTO observations VALUES (:src, :dest, :verb, 1)
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以在一个SQLite语句中执行整个操作.这将简化应用程序逻辑(这需要与数据库操作完全异步),并且还避免使用完全相同的密钥进行双索引查找.INSERT OR REPLACE似乎不是我想要的,唉没有UPDATE …
我们正在使用Oracle 11g数据库.
正如你可能会或可能不知道,如果你在前面的字符串使用通配符查询用"%",列没有被使用的索引和全表扫描正在发生的事情.
看起来似乎没有关于如何改进此类查询的明确建议,但也许您可以根据您的经验分享一些有价值的信息,以了解如何优化以下查询:
SELECT *
FROM myTable
WHERE UPPER(CustomerName) like '%ABC%'
OR UPPER(IndemnifierOneName) like '%ABC%'
OR UPPER(IndemnifierTwoName) like '%ABC%';
Run Code Online (Sandbox Code Playgroud)
...其中所有3列的类型为varchar2(100),ABC是变量输入参数的值.
@All建议使用CONTEX索引,请注意我的数据每天的任何时间都会更新,而且这个索引需要重新同步,因此对于150万行的表来说这不是一个好的选择,抱歉.
PS我会支持每个答案,所以请保持他们的到来.
我正在使用Drupal 6与MySQL 5.0.95版本,并且陷入僵局,其中我的一个基于最近文章日期显示内容的查询速度变慢,并且由于使用频率导致网站性能完全丧失.有问题的查询如下:
SELECT n.nid,
n.title,
ma.field_article_date_format_value,
ma.field_article_summary_value
FROM node n
INNER JOIN content_type_article ma ON n.nid=ma.nid
INNER JOIN term_node tn ON n.nid=tn.nid
WHERE tn.tid= 153
AND n.status=1
ORDER BY ma.field_article_date_format_value DESC
LIMIT 0, 11;
Run Code Online (Sandbox Code Playgroud)
查询的EXPLAIN显示以下结果:
+----+-------------+-------+--------+--------------------------+---------+---------+----------------------+-------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+--------------------------+---------+---------+----------------------+-------+---------------------------------+
| 1 | SIMPLE | tn | ref | PRIMARY,nid | PRIMARY | 4 | const | 19006 | Using temporary; …Run Code Online (Sandbox Code Playgroud) 运行此查询的框是在数据中心中运行的专用服务器.
AMD Opteron 1354四核2.20GHz 2GB内存Windows Server 2008 x64(是的,我知道我只有2GB内存,当项目上线时我升级到8GB).
因此,我在表格中创建了250,000个虚拟行,以真正压力测试LINQ to SQL生成的一些查询,并确保它们不会太糟糕,我注意到其中一个正在花费大量时间.
我使用索引将此查询缩短到17秒,但为了这个答案,我从头到尾删除了它们.只有索引是主键.
Stories table --
[ID] [int] IDENTITY(1,1) NOT NULL,
[UserID] [int] NOT NULL,
[CategoryID] [int] NOT NULL,
[VoteCount] [int] NOT NULL,
[CommentCount] [int] NOT NULL,
[Title] [nvarchar](96) NOT NULL,
[Description] [nvarchar](1024) NOT NULL,
[CreatedAt] [datetime] NOT NULL,
[UniqueName] [nvarchar](96) NOT NULL,
[Url] [nvarchar](512) NOT NULL,
[LastActivityAt] [datetime] NOT NULL,
Categories table --
[ID] [int] IDENTITY(1,1) NOT NULL,
[ShortName] [nvarchar](8) NOT NULL,
[Name] [nvarchar](64) NOT NULL,
Users table --
[ID] …Run Code Online (Sandbox Code Playgroud) 我只是在Zend中设置FirePHP,我注意到大量的DESCRIBE查询.某些页面在同一个表上有50个或更多相同的查询.例如
0.00198 connect NULL 0.00449 DESCRIBE `nodes` NULL 0.00041 SELECT `nodes`.* FROM `nodes` WHERE (((`nodes`.`id` = 111))) NULL 0.0037 DESCRIBE `nodes` NULL 0.00155 SELECT `nodes`.* FROM `nodes` WHERE (((`nodes`.`id` = 111))) NULL 0.00059 SELECT `nodes`.* FROM `nodes` WHERE (parent_id = '111') ORDER BY `order` ASC, `id` ASC NULL 0.00366 DESCRIBE `nodes` NULL 0.0054 DESCRIBE `nodes` NULL 0.0049 DESCRIBE `nodes` NULL 0.00519 DESCRIBE `nodes` NULL 0.00492 DESCRIBE `nodes` NULL 0.00691 DESCRIBE `nodes` NULL 0.00741 DESCRIBE `nodes` NULL 0.0048 DESCRIBE `nodes` NULL …
我很好奇为什么我们需要使用,LEFT JOIN因为我们可以使用逗号来选择多个表.
LEFT JOIN使用逗号选择多个表之间有什么区别.
哪一个更快?
这是我的代码:
SELECT mw.*,
nvs.*
FROM mst_words mw
LEFT JOIN (SELECT no as nonvs,
owner,
owner_no,
vocab_no,
correct
FROM vocab_stats
WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no
WHERE (nvs.correct > 0 )
AND mw.level = 1
Run Code Online (Sandbox Code Playgroud)
...和:
SELECT *
FROM vocab_stats vs,
mst_words mw
WHERE mw.no = vs.vocab_no
AND vs.correct > 0
AND mw.level = 1
AND vs.owner = 1111
Run Code Online (Sandbox Code Playgroud) 所以我有其他人写的这个查询,我正在尝试重构,这为项目提供了一些功能/材料(通常是鞋子).
有很多产品,因此有很多连接表条目,但只有少数几个可用的功能.我认为必须有一种方法可以减少触及"大"项目列表的需要,以获得这些功能,我听说要明确避免,但我没有可以替换此处"不同"选项的语句.
根据我的日志,我的结果时间很慢:
Query_time:7 Lock_time:0 Rows_sent:32 Rows_examined:5362862
Query_time:8 Lock_time:0 Rows_sent:22 Rows_examined:6581994
正如消息所说,有时它需要7或8秒,有时或每次查询超过500万行.
这可能是由于同时发生的其他负载,因为这里是直接从mysql命令行在数据库上运行的选择:
mysql> SELECT DISTINCT features.FeatureId, features.Name
FROM features, itemsfeatures, items
WHERE items.FlagStatus != 'U'
AND items.TypeId = '13'
AND features.Type = 'Material'
AND features.FeatureId = itemsfeatures.FeatureId
ORDER BY features.Name;
+-----------+--------------------+
| FeatureId | Name |
+-----------+--------------------+
| 40 | Alligator |
| 41 | Burnished Calfskin |
| 42 | Calfskin |
| 59 | Canvas |
| 43 | Chromexcel |
| 44 | Cordovan |
| …Run Code Online (Sandbox Code Playgroud) 需要你帮助优化一个mysql查询.让我们以简单的表格为例.
CREATE TABLE `Modules` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`moduleName` varchar(100) NOT NULL,
`menuName` varchar(255) NOT NULL,
PRIMARY KEY (`ID`),
KEY `moduleName` (`moduleName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)
让我们填写一些数据:
INSERT INTO `Modules` (`moduleName` ,`menuName`)
VALUES
('abc1', 'name1'),
('abc', 'name2'),
('ddf', 'name3'),
('ccc', 'name4'),
('fer', 'name5');
Run Code Online (Sandbox Code Playgroud)
还有一些样本字符串.让它成为abc_def;
传统上我们试图找到包含搜索字符串的所有行.
相反,我的任务是找到包含moduleName在输入字符串中的所有行.现在我有以下查询来获得所需的结果:
SELECT `moduleName` ,`menuName`
FROM `Modules`
WHERE 'abc_def' LIKE(CONCAT(`moduleName`,'%'))
Run Code Online (Sandbox Code Playgroud)
这将返回
moduleName | menuName
---------------------------
abc | name2
Run Code Online (Sandbox Code Playgroud)
问题是,此查询未使用索引.
有没有办法强迫它使用一个?
我有一个SQL Server 2012表与2697记录,表没有索引.未来数据将增加至多10万条记录.我没有加入任何其他表来检索记录.最初我创建了一个用户定义的函数来从表中检索记录.
后来我才知道视图会比用户定义的函数更快,因此我为该表创建了一个View.
要了解Query的性能,我包含以下代码以获取我的UDF,VIEW和直接SQL语句的CPU时间和已用时间.
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
Run Code Online (Sandbox Code Playgroud)
当我使用select查询直接从我的表中提取数据时,我得到了下面的CPU时间和经过的时间
SELECT [CollegeName]
,[CandidateID]
,[age]
,[race]
,[sex]
,[ethnic]
,[arm]
,[Weeknum]
,[siteid]
,[country]
,[Region]
,[SubRegion]
,[SNAME]
,[UID]
FROM [testdata]
Run Code Online (Sandbox Code Playgroud)
----结果
Scan count 1, logical reads 1338, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 31 ms, elapsed time = 4381 ms.
Run Code Online (Sandbox Code Playgroud)
当我使用VIEW时,我得到了CPU时间和经过时间
CREATE VIEW vw_testdata
AS
SELECT [CollegeName]
,[CandidateID]
,[age]
,[race] …Run Code Online (Sandbox Code Playgroud) sql ×6
mysql ×4
indexing ×2
sql-server ×2
distinct ×1
left-join ×1
linq-to-sql ×1
oracle ×1
performance ×1
php ×1
sql-order-by ×1
sqlite ×1