科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道实例讲解MYSQL数据库的查询优化技术

实例讲解MYSQL数据库的查询优化技术

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

如何设计高效合理的查询语句就显得非常重要。本文以应用实例为基础,结合数据库理论,介绍查询优化技术在现实系统中的运用。

来源:中国IT实验室 2008年5月19日

关键字: 技巧 数据库 MySQL

  • 评论
  • 分享微博
  • 分享邮件
5.避免困难的正规表达式
  
  MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”
  
  即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。
  
  另外,还要避免非开始的子串。例如语句:SELECT * FROM customer WHERE zipcode[2,3]>“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。
  
  6.使用临时表加速查询
  
  把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如:
  
  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
  如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:
  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
  INTO TEMP cust_with_balance
  然后以下面的方式在临时表中查询:
  SELECT * FROM cust_with_balance

  WHERE postcode>“98000”
  
  临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。
  
  注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。
  
  7.用排序来取代非顺序存取
  
  非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。
  
  有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。
  
  实例分析
  
  下面我们举一个制造公司的例子来说明如何进行查询优化。制造公司数据库中包括3个表,模式如下所示:
  
  1.part表
  
  零件号     零件描述        其他列
  
  (part_num) (part_desc)      (other column)
  
  102,032   Seageat 30G disk     ……
  
  500,049   Novel 10M network card  ……
  
  ……
  
  2.vendor表
  
  厂商号      厂商名      其他列
  
  (vendor _num) (vendor_name) (other column)
  
  910,257     Seageat Corp   ……
  
  523,045     IBM Corp     ……
  
  ……
  
  3.parven表
  
  零件号     厂商号     零件数量
  
  (part_num) (vendor_num) (part_amount)
  
  102,032    910,257    3,450,000
  
  234,423    321,001    4,000,000
  
  ……
  
  下面的查询将在这些表上定期运行,并产生关于所有零件数量的报表:
  
  SELECT part_desc,vendor_name,part_amount
  
  FROM part,vendor,par
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章