如何设计一个高效合理的mysql查询语句

如何设计一个高效合理的mysql查询语句
MySQL查询语句都被使用,但是我们应该如何设计高效合理的MySQL查询语句呢下面是教你mysql查询语句的合理设计方法,并与大家分享,供大家学习和学习。

1。合理使用指数

索引是数据库中重要的数据结构,其根本目的是为了提高查询效率。大部分的数据库产品现在使用IBM的第一个索引结构,索引的使用是适当的,和下面的原则如下:

在频繁连接中,在未指定为外键的列上没有建立索引,而不经常连接的字段将由优化器自动索引。

在经常排序或分组的列上建立索引(即按操作分组或按顺序排列)。

建立一个与许多不同的通常用在条件表达式的值列中搜索,而不是建立在一个与一个小数量的不同的值的列的索引。例如,只有男人和女人在雇员表的性别名单中有两个不同的值,所以没有必要建立索引如果索引的建立不会提高查询效率,反而会降低更新速度

如果要对多个列进行排序,则可以在这些列上建立复合索引(复合索引)。

使用系统工具。如果Informix数据库有一个tbcheck工具,它可以在一个可疑的指标检查。在数据库服务器中,指数可能失败或由于频繁操作,使阅读效率,如果查询使用索引不清楚慢下来,试着用tbcheck工具检查索引的完整性,修复时必要的。此外,在数据库表更新大量数据,删除并重建索引可以提高查询的速度。

2。避免或简化排序

对于大表的重复顺序应该简化或避免。当索引能自动按适当的顺序生成输出时,优化器避免了排序的步骤

索引不包含要排序的一列或数列。

组中的列或按BY子句的顺序与索引的顺序不一致;

排序的列来自不同的表。

为了避免不必要的排序,有必要正确地构建索引,合理地合并数据库表(虽然有时会影响表的规范化,但相对于效率而言是值得改进的)。

三.消除对大表行数据的顺序访问

在嵌套查询,顺序访问表的查询效率可能有致命的影响。例如,顺序存取策略,一个嵌套3层的查询,如果1000行查询各层,然后查询将数据查询10亿行。为了避免这是索引的连接柱的主要方式,例如,两个表:学生表(学校名称、姓名、年龄…)和选择表(学号,课程号,成绩)。如果两表是连接,一个指标是学校数量的连接领域设定。

还可以使用联合来避免顺序访问。尽管所有检查列都有索引,但是WHERE子句的某些形式强制优化器使用顺序访问:
SELECT * FROM订单(customer_num = 104和order_num > 1001)或order_num = 1008
虽然指数是建立在customer_num和order_num,上述优化器使用顺序存取路径扫描整个表。因为这句话是检索收集分离的行,则应改为下列语句:
SELECT * FROM订单customer_num = 104和order_num > 1001
联盟
SELECT * FROM订单order_num = 1008
通过这种方式,您可以使用索引路径处理查询。

4。避免相关子查询

列标签也出现在主查询和WHERE子句的查询中。很有可能,当一列值的变化在主查询,子查询必须再次质疑。更多的嵌套层次查询,效率较低,所以查询应尽可能避免。如果子查询是不可避免的,你应该过滤尽可能多的行的子查询。

5。避免困难的正规表达式

匹配和类似关键字支持通配符匹配,在技术上称为正则表达式。但是这种匹配非常耗时:
选择*从客户那里像98_ _ _邮编
即使指数是建立在邮政编码字段,顺序扫描也用在这种情况下,如果语句改为选择*从客户那里邮编> 98000,查询将查询与索引执行查询时,明显提高了速度。

此外,非启动子也是可以避免的。例如,声明:选择*从客户那里邮编{ 2, 3 } > 80,采用非启动子在WHERE子句中,这样的声明不使用索引。

6。使用临时表来加快查询速度

排序表的子集并创建临时表有时可以加速查询。它有助于避免多个排序操作,并且在其他方面可以简化优化器的工作
选择cust.name,rcvbles。平衡等栏目,…
从客户,rcvbles
在cust.customer_id = rcvlbes.customer_id
和rcvblls平衡>0。
和客户邮编> 98000
为了cust.name
如果要多次执行查询,那么所有未支付的客户都可以在临时文件中找到,并根据客户的名字进行排序。
选择cust.name,rcvbles。平衡等栏目,…
从客户,rcvbles
在cust.customer_id = rcvlbes.customer_id
和rcvblls平衡>0。
为了cust.name
临时cust_with_balance
然后按以下方式查询临时表:
SELECT * FROM cust_with_balance
在邮政编码> 98000
临时表中的行小于主表中的行,而物理顺序是所需的序列,这减少了磁盘I/O,因此查询工作量可以显著减少。

注意:临时表的创建并不能反映主表的修改。在频繁修改主表数据的情况下,注意不要丢失数据。

7。使用排序替换非顺序访问

非顺序磁盘访问速度最慢的操作,来回移动磁盘上存取臂。SQL语句隐藏了这一情况,便于我们写查询需要访问大量的非连续的页编写应用程序的时候,在某些情况下,使用数据库的排序能力代替非顺序访问可以提高查询。
以上是如何教你如何设计高效合理的mysql查询语言,希望能对你有所帮助。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部