Heim Datenbank MySQL-Tutorial 分享几条sql语句命令优化技巧

分享几条sql语句命令优化技巧

Jun 07, 2016 pm 05:49 PM
sql优化

本文章分享几条sql语句命令优化技巧,有需要了解的同学可参考一下。

1、应用程序中,保证在实现功能的基础上,尽量减少对的访问次数;通过
搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;能够分
开的操作尽量分开处理,提高每次的响应速度;在数据窗口使用SQL时,尽量把使
用的索引放在选择的首列;算法的结构尽量简单;在查询时,不要过多地使用通配
符如SELECT * FROM T1语句,要用到几列就选择几列如:SELECT COL1,COL2 FROM
T1;在可能的情况下尽量限制尽量结果集行数如:SELECT TOP 300
COL1,COL2,COL3 FROM T1,因为某些情况下用户是不需要那么多的数据的。不要在
应用中使用数据库游标,游标是非常有用的工具,但比使用常规的、面向集的SQL
语句需要更大的开销;按照特定顺序提取数据的查找。 

2、 避免使用不兼容的数据类型。例如float和int、char和varchar、binary和
varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进
行的优化操作。例如: 
SELECT name FROM employee WHERE salary > 60000 
在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000
是个整型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。 

3、 尽量避免在WHERE子句中对字段进行函数或表达式操作,这将导致引擎放弃
使用索引而进行全表扫描。如: 
SELECT * FROM T1 WHERE F1/2=100
应改为: 
SELECT * FROM T1 WHERE F1=100*2

SELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=’5378’
应改为:
SELECT * FROM RECORD WHERE CARD_NO LIKE ‘5378%’

SELECT member_number, first_name, last_name FROM members
WHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21
应改为:
SELECT member_number, first_name, last_name FROM members
WHERE dateofbirth 即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询
时要尽可能将操作移至等号右边。

4、 避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN等这样的操作符,
因为这会使系统无法使用索引,而只能直接搜索表中的数据。例如: 
SELECT id FROM employee WHERE id != 'B%' 
优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。
 
5、 尽量使用数字型字段,一部分开发人员和数据库管理人员喜欢把包含数值信
息的字段
设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在
处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一
次就够了。

6、 合理使用EXISTS,NOT EXISTS子句。如下所示:
1.SELECT SUM(T1.C1)FROM T1 WHERE(
(SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0)
2.SELECT SUM(T1.C1) FROM T1WHERE EXISTS(
  SELECT * FROM T2 WHERE T2.C2=T1.C2)
两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁
定的表扫描或是索引扫描。
如果你想校验表里是否存在某条纪录,不要用(*)那样效率很低,而且浪费服
务器资源。可以用EXISTS代替。如:
IF (SELECT COUNT(*) FROM table_name WHERE column_name = 'xxx')
可以写成:
IF EXISTS (SELECT * FROM table_name WHERE column_name = 'xxx')

经常需要写一个T_SQL语句比较一个父结果集和子结果集,从而找到是否存在在父
结果集中有而在子结果集中没有的记录,如:
1.SELECT a.hdr_key FROM hdr_tbl a---- tbl a 表示tbl用别名a代替
WHERE NOT EXISTS (SELECT * FROM dtl_tbl b WHERE a.hdr_key = b.hdr_key) 

2.SELECT a.hdr_key FROM hdr_tbl a
LEFT JOIN dtl_tbl b ON a.hdr_key = b.hdr_key WHERE b.hdr_key IS NULL 

3.SELECT hdr_key FROM hdr_tbl
WHERE hdr_key NOT IN (SELECT hdr_key FROM dtl_tbl) 
  三种写法都可以得到同样正确的结果,但是效率依次降低。

7、 尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法
利用索引。  
见如下例子:
SELECT * FROM T1 WHERE NAME LIKE ‘%L%’
SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’
SELECT * FROM T1 WHERE NAME LIKE ‘L%’
即使NAME字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎不得不
对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快操作。

8、 分利用连接条件,在某种情况下,两个表之间可能不只一个的连接条件,这
时在 WHERE 子句中将连接条件完整的写上,有可能大大提高查询速度。
例:
SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO 
SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO
AND A.ACCOUNT_NO=B.ACCOUNT_NO
第二句将比第一句执行快得多。

9、 消除对大型表行数据的顺序存取
  尽管在所有的检查列上都有索引,但某些形式的WHERE子句强迫优化器使用
顺序存取。如:
SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR 
order_num=1008
解决办法可以使用并集来避免顺序存取:
SELECT * FROM orders WHERE customer_num=104 AND order_num>1001 
UNION 
SELECT * FROM orders WHERE order_num=1008 
这样就能利用索引路径处理查询。

10、 避免困难的正规表达式
  LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时
间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _” 
即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如
果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询
时就会利用索引来查询,显然会大大提高速度。
11、 使用视图加速查询
把表的一个子集进行排序并创建视图,有时能加速查询。它有助于避免多重排序
操作,而且在其他方面还能简化优化器的工作。例如: 
SELECT cust.name,rcvbles.balance,……other columns 
FROM cust,rcvbles 
WHERE cust.customer_id = rcvlbes.customer_id 
AND rcvblls.balance>0 
AND cust.postcode>“98000” 
ORDER BY cust.name 
如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个
视图中,并按客户的名字进行排序: 
CREATE VIEW DBO.V_CUST_RCVLBES
AS 
SELECT cust.name,rcvbles.balance,……other columns 
FROM cust,rcvbles 
WHERE cust.customer_id = rcvlbes.customer_id 
AND rcvblls.balance>0 
ORDER BY cust.name 

然后以下面的方式在视图中查询: 
SELECT * FROM V_CUST_RCVLBES
WHERE postcode>“98000” 
视图中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘
I/O,所以查询工作量可以得到大幅减少。

12、 能够用BETWEEN的就不要用IN
SELECT * FROM T1 WHERE ID IN (10,11,12,13,14)
改成:
SELECT * FROM T1 WHERE ID BETWEEN 10 AND 14
因为IN会使系统无法使用索引,而只能直接搜索表中的数据。

13、 DISTINCT的就不用GROUP BY
  SELECT OrderID FROM Details WHERE UnitPrice > 10 GROUP BY OrderID
  可改为:
  SELECT DISTINCT OrderID FROM Details WHERE UnitPrice > 10
   

14、 部分利用索引
  1.SELECT employeeID, firstname, lastname
FROM names
WHERE dept = 'prod' or city = 'Orlando' or division = 'food'

  2.SELECT employeeID, firstname, lastname FROM names WHERE dept =
'prod'
UNION ALL
SELECT employeeID, firstname, lastname FROM names WHERE city = 'Orlando'
UNION ALL
SELECT employeeID, firstname, lastname FROM names WHERE division =
'food'
如果dept 列建有索引则查询2可以部分利用索引,查询1则不能。

15、 能用UNION ALL就不要用UNION
UNION ALL不执行SELECT DISTINCT函数,这样就会减少很多不必要的资源

16、 不要写一些不做任何事的查询
如:SELECT COL1 FROM T1 WHERE 1=0
  SELECT COL1 FROM T1 WHERE COL1=1 AND COL1=2
这类死码不会返回任何结果集,但是会消耗系统资源。

17、 尽量不要用SELECT INTO语句。
SELECT INTO 语句会导致表锁定,阻止其他用户访问该表。

18、 必要时强制查询优化器使用某个索引
  SELECT * FROM T1 WHERE nextprocess = 1 AND processid IN (8,32,45) 
改成:
SELECT * FROM T1 (INDEX = IX_ProcessID) WHERE nextprocess = 1 AND
processid IN (8,32,45)
则查询优化器将会强行利用索引IX_ProcessID 执行查询。
   
19、 虽然UPDATE、DELETE语句的写法基本固定,但是还是对UPDATE语句给点建
议:
a) 尽量不要修改主键字段。
b) 当修改VARCHAR型字段时,尽量使用相同长度内容的值代替。
c) 尽量最小化对于含有UPDATE触发器的表的UPDATE操作。
d) 避免UPDATE将要复制到其他数据库的列。
e) 避免UPDATE建有很多索引的列。
f) 避免UPDATE在WHERE子句条件中的列。

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie kann die Leistung des Discuz-Forums optimiert werden? Wie kann die Leistung des Discuz-Forums optimiert werden? Mar 12, 2024 pm 06:48 PM

Wie kann die Leistung des Discuz-Forums optimiert werden? Einleitung: Discuz ist ein häufig verwendetes Forensystem, bei dessen Verwendung es jedoch zu Leistungsengpässen kommen kann. Um die Leistung von Discuz Forum zu verbessern, können wir es in vielerlei Hinsicht optimieren, einschließlich Datenbankoptimierung, Cache-Einstellungen, Codeanpassung usw. Im Folgenden wird erläutert, wie Sie die Leistung des Discuz-Forums mithilfe spezifischer Vorgänge und Codebeispiele optimieren können. 1. Datenbankoptimierung: Indexoptimierung: Durch das Erstellen von Indizes für häufig verwendete Abfragefelder kann die Abfragegeschwindigkeit erheblich verbessert werden. Zum Beispiel

Wie kann die Leistung von SQL Server und MySQL optimiert werden, damit sie ihre beste Leistung erbringen können? Wie kann die Leistung von SQL Server und MySQL optimiert werden, damit sie ihre beste Leistung erbringen können? Sep 11, 2023 pm 01:40 PM

Wie kann die Leistung von SQLServer und MySQL optimiert werden, damit sie ihre beste Leistung erbringen können? Zusammenfassung: In heutigen Datenbankanwendungen sind SQLServer und MySQL die beiden häufigsten und beliebtesten relationalen Datenbankverwaltungssysteme (RDBMS). Da die Datenmenge zunimmt und sich die Geschäftsanforderungen ständig ändern, ist die Optimierung der Datenbankleistung besonders wichtig geworden. In diesem Artikel werden einige gängige Methoden und Techniken zur Optimierung der Leistung von SQLServer und MySQL vorgestellt, damit Benutzer die Vorteile nutzen können

Linux-Leistungsoptimierung ~ Linux-Leistungsoptimierung ~ Feb 12, 2024 pm 03:30 PM

Das Linux-Betriebssystem ist ein Open-Source-Produkt und gleichzeitig eine Übungs- und Anwendungsplattform für Open-Source-Software. Unter dieser Plattform gibt es unzählige Open-Source-Softwareunterstützungen wie Apache, Tomcat, MySQL, PHP usw. Das größte Konzept von Open-Source-Software ist Freiheit und Offenheit. Als Open-Source-Plattform ist es daher das Ziel von Linux, durch die Unterstützung dieser Open-Source-Software eine optimale Anwendungsleistung zu niedrigsten Kosten zu erreichen. Bei Leistungsproblemen wird vor allem die beste Kombination aus Linux-Betriebssystem und Anwendungen erreicht. 1. Überblick über Leistungsprobleme Die Systemleistung bezieht sich auf die Effektivität, Stabilität und Reaktionsgeschwindigkeit des Betriebssystems bei der Erledigung von Aufgaben. Linux-Systemadministratoren können häufig auf Probleme wie Systeminstabilität und langsame Reaktionsgeschwindigkeit stoßen, z

Kernunterschiede zwischen Sybase- und Oracle-Datenbankverwaltungssystemen Kernunterschiede zwischen Sybase- und Oracle-Datenbankverwaltungssystemen Mar 08, 2024 pm 05:54 PM

Die Kernunterschiede zwischen Sybase- und Oracle-Datenbankverwaltungssystemen erfordern spezifische Codebeispiele. Datenbankverwaltungssysteme spielen im Bereich der modernen Informationstechnologie eine wichtige Rolle, da zwei bekannte relationale Datenbankverwaltungssysteme eine wichtige Rolle einnehmen Datenbankfeld. Obwohl es sich bei beiden um relationale Datenbankverwaltungssysteme handelt, gibt es einige wesentliche Unterschiede in der praktischen Anwendung. In diesem Artikel werden Sybase und Oracle aus verschiedenen Perspektiven verglichen, einschließlich Architektur, Syntax, Leistung usw.

Was bedeutet irgendein in SQL? Was bedeutet irgendein in SQL? May 01, 2024 pm 11:03 PM

Das Schlüsselwort ANY in SQL wird verwendet, um zu überprüfen, ob eine Unterabfrage Zeilen zurückgibt, die eine bestimmte Bedingung erfüllen: Syntax: ANY (Unterabfrage) Verwendung: Wird mit Vergleichsoperatoren verwendet. Wenn die Unterabfrage Zeilen zurückgibt, die die Bedingung erfüllen, wird der ANY-Ausdruck als ausgewertet true Vorteile: vereinfacht Abfragen, verbessert die Effizienz und eignet sich für die Verarbeitung großer Datenmengen. Einschränkungen: stellt keine bestimmten Zeilen bereit, die die Bedingung erfüllen. Wenn die Unterabfrage mehrere Zeilen zurückgibt, die die Bedingung erfüllen, wird nur true zurückgegeben

Ausführungsplan für MySQL-SQL-Anweisungen: So optimieren Sie den MySQL-Abfrageprozess Ausführungsplan für MySQL-SQL-Anweisungen: So optimieren Sie den MySQL-Abfrageprozess Jun 16, 2023 am 09:15 AM

Mit der rasanten Entwicklung des Internets wird die Speicherung und Verarbeitung von Daten immer wichtiger. Daher sind relationale Datenbanken ein integraler Bestandteil moderner Softwareplattformen. Die MySQL-Datenbank hat sich zu einer der beliebtesten relationalen Datenbanken entwickelt, da sie einfach zu verwenden, einfach bereitzustellen und zu verwalten ist. Bei der Verarbeitung großer Datenmengen treten jedoch häufig Leistungsprobleme bei MySQL-Datenbanken auf. In diesem Artikel befassen wir uns mit dem SQL-Anweisungsausführungsplan von MySQL und stellen vor, wie MySQL-Daten durch Optimierung des Abfrageprozesses verbessert werden können.

Leistungsoptimierung von SQL Server und MySQL: Best Practices und wichtige Tipps. Leistungsoptimierung von SQL Server und MySQL: Best Practices und wichtige Tipps. Sep 11, 2023 pm 12:46 PM

SQLServer- und MySQL-Leistungsoptimierung: Best Practices und wichtige Tipps Zusammenfassung: In diesem Artikel werden die Leistungsoptimierungsmethoden zweier gängiger relationaler Datenbanksysteme, SQLServer und MySQL, vorgestellt und einige Best Practices und wichtige Tipps bereitgestellt, die Entwicklern und Datenbankadministratoren dabei helfen, die Leistung und Leistung zu verbessern Effizienz von Datenbanksystemen. Einleitung: In der modernen Anwendungsentwicklung sind Datenbanksysteme ein unverzichtbarer Bestandteil. Da die Datenmenge zunimmt und die Anforderungen der Benutzer steigen, wird die Optimierung der Datenbankleistung besonders wichtig. Quadrat

Erfahrungsaustausch und Zusammenfassung von Java-Kenntnissen zur Optimierung des Datenbanksucheffekts Erfahrungsaustausch und Zusammenfassung von Java-Kenntnissen zur Optimierung des Datenbanksucheffekts Sep 18, 2023 am 09:25 AM

Erfahrungsaustausch und Zusammenfassung von Java-Kenntnissen zur Optimierung des Datenbanksucheffekts Zusammenfassung: Die Datenbanksuche ist einer der häufigsten Vorgänge in den meisten Anwendungen. Wenn die Datenmenge jedoch groß ist, können Suchvorgänge langsam werden, was sich auf die Anwendungsleistung und Antwortzeit auswirkt. In diesem Artikel werden einige Java-Tipps zur Optimierung der Datenbanksuchergebnisse vorgestellt und spezifische Codebeispiele bereitgestellt. Verwenden von Indizes Die Indizierung ist ein wichtiger Bestandteil zur Verbesserung der Sucheffizienz in einer Datenbank. Bevor Sie einen Suchvorgang durchführen, stellen Sie sicher, dass Sie geeignete Indizes für die Spalten erstellen, die durchsucht werden müssen. Zum Beispiel

See all articles