接下来一并统计就ok了

免以 where 子句被使用 or 来连接

  如果一个字段有目录,一个字段没有索引,将促成发动机放弃下索引而进行全表扫描,如:

select id from table where num=10 or name = 'admin'

  可以如此查询:

select id from table where num = 10
union all
select id from table where name = 'admin'

 

叫一样蔸边带权树,问两接触内的离小于等于K的接触对出微只。

4.主键和唯一索引的界别

  主键是同样栽约束,唯一索引是同一种索引,两者在本质上是差之。主键创建后决然带有一个唯一性索引,唯一性索引并不一定就是主键。唯一性索引列允许空值,而主键列不允许吗空值。主键列于开创时,已经默认为空值

  • 唯一索引了。

  主键可以给另外表引用为外键,而唯一索引不能够。一个表明最多只能创造一个主键,但足创造多只唯一索引。主键更合乎那些未易于改的绝无仅有标识,如自行递增列、身份证号等。

  在 RBO 模式下,主键的施行计划先级要高于唯一索引。
两者可以加强查询的速。

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<queue>
 6 #include<algorithm>
 7 #define inf 2000000007
 8 using namespace std;
 9 
10 int n,m;
11 double l,u;
12 double dis[1007];int ins[1007],num[1007];
13 int cnt,head[1007],Next[1000007],rea[1000007];double val[1000007];
14 
15 void add(int u,int v,double fee)
16 {
17     Next[++cnt]=head[u];
18     head[u]=cnt;
19     rea[cnt]=v;
20     val[cnt]=fee;
21 }
22 bool Spfa()
23 {
24     for (int i=1;i<=n+m;i++)
25         dis[i]=inf,ins[i]=0,num[i]=0;
26     queue<int>q;
27     q.push(1);dis[1]=0,ins[1]=num[1]=1;    
28     while(!q.empty())
29     {
30         int u=q.front();q.pop();
31         for (int i=head[u];i!=-1;i=Next[i])
32         {
33             int v=rea[i];double fee=val[u];
34             if (dis[v]>dis[u]+fee)
35             {
36                 dis[v]=dis[u]+fee;
37                 if (!ins[v])
38                 {
39                     ins[v]=1;
40                     q.push(v);
41                     num[v]++;
42                     if (num[v]>sqrt(n+m)) return false;
43                 }
44             }
45         }
46         ins[u]=0;
47     }
48     return true;
49 }
50 int main()
51 {
52     while(~scanf("%d%d%lf%lf",&n,&m,&l,&u))
53     {
54         cnt=0;double x;
55         memset(head,-1,sizeof(head));
56         for(int i=1;i<=n;i++)
57             for(int j=1;j<=m;j++)
58             {
59                 scanf("%lf",&x);
60                 add(j+n,i,log(u)-log(x));
61                 add(i,j+n,log(x)-log(l));
62             }
63         if(Spfa()) puts("YES");
64         else puts("NO");
65     }
66 }

where子句子优化

  where
子句被应用参数,会招致全表扫描,因为SQL只来当运转时才会分析局部变量,但优化程序不可知以拜访计划之选项推迟至运行时;它必须于编译时展开抉择。然
而,如果以编译时成立访问计划,变量的价还是雾里看花之,因而无法作为目录选择的输入项。
  应尽量避免在 where
子句被对字段进行表达式操作,避免在where子句被针对字段进行函数操作就将促成发动机放弃以索引而开展全表扫描。不要以
where
子句被之“=”左边进行函数、算术运算或其它表达式运算,否则系统以可能无法正确行使索引。

 

(注:文章出处)

模板题:就是络绎不绝找树的基点,然后分别了,分治,至少分成两半,就是上限也log

EXPLAIN SELECT

  explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮忙选择再好的目录和描写有又优化的询问语句。主要用法即是当select前加上explain即可。

EXPLAIN SELECT [查找字段名] FROM tab_name ...

  于 EXPLAIN
的助下,你尽管掌握什么时候该让表添加索引,以使用索引来查找记录从而给
SELECT 运行更快。

 

 

使用NOT NULL

  很多表都包含可也 NULL (空值) 的排列,即使应用程序井无需要保留 NULL
也是如此 ,这是为可为 NULL 是排的默认属性。通常状态下最好指定列为 NOT
NULL,除非真 的要仓储 NULL 值。
设若查询中寓可为 NULL 的排列,对 MySQL 来说还难优化 ,因为可为 NULL
的列使 得索引、索引统计和值比较还又复杂 。可为NULL
的列会使用重复多之蕴藏空间 ,在 MySQL 里啊欲非常处理 。当可为NULL
的列被索引肘,每个索引记录得一个额 外的字节,在 MyISAM
里竟是还可能造成固定大小 的索引 (例如只发一个整数列的 索引)
变成可变大小的目录。
  通常将可也 NULL 的列改为 NOT NULL 带来的性能提升比较小 ,所以
(调优时) 没有 必要首先在存活schema中查找井修改掉这种景象
,除非确定这会招致问题。但是, 如果计划以列上建索引
,就应当尽量避免设计成为可为 NULL 的排列。当然为有章外
,例如值得一提的凡,InnoDB 使用单独的位 (bit ) 存储 NULL 值 ,所
以对稀疏数据由产生很好之长空效率 。但立刻等同触及不适用于MyISAM 。

 

 

1.主键索引

意:唯一约束和加强查询速度

#建表时创建主键索引
create table `table_name`(
    `id` int unsigned not null auto_increment,
    primary key(`id`)
);

#删除主键索引
alter table `table_name` drop primary key(`id`);

#已有表增加主键索引
alter table `table_name` add primary key(`id`);

 

避大数据量返回

此间而考虑下limit,来限制返回的数据量,如果老是回去大量融洽未待之数量,也会见下滑查询速度。

 

仓储引擎的选项

  对于什么选择MyISAM和InnoDB,如果你得事务处理或是外键,那么InnoDB可能是于好的法门。如果你需要全文索引,那么一般来说MyISAM是好的选,因为当时是网内建的,然而,我们实际上并无见面不时地失去测试两百万实践记录。所以,就到底慢一点,我们得以经过使用Sphinx从InnoDB中得到全文索引。
  数据的轻重,是一个影响而挑什么存储引擎的要元素,大尺寸的多寡集趋向于选择InnoDB方式,因为该绷事务处理和故障恢复。数据库的在稍微决定了故障恢复的年华长,InnoDB可以利用工作日志进行数据恢复,这会于快。而MyISAM可能会见需要几只钟头还几上来涉及这些事,InnoDB只待几分钟。
  你操作数据库表的惯或也会是一个对性能影响非常十分之素。比如:
COUNT() 在
MyISAM表中见面死抢,而在InnoDB表下可能会见坏惨痛。而主键查询则当InnoDB下会一定相当之尽早,但需小心的凡只要我们的主键太长了邪会促成性问题。大批之inserts语句以MyISAM下会快一些,但是updates在InnoDB
下会又快一些——尤其当并发量大的时刻。
  所以,到底你查使用啊一个呢?根据涉来拘禁,如果是有些微型的使或项目,那么MyISAM也许会又合乎。当然,在大型的环境下采取MyISAM也会生出不行要命成功的当儿,但也不总是这样的。如果你正在计划使用一个重特大数据量的类型,而且用事务处理或外键支持,那么你真应该一直行使InnoDB方式。但需牢记InnoDB的表需要再次多的内存和贮,转换100GB的MyISAM
表到InnoDB 表可能会见给你出坏可怜之心得。

 

索引

少用SELECT *

  使用select时,应该取得我们要为此底数目,而非是全取。因为当我们select
*不时,会大增web服务器的承负,增加网络传输的载荷,查询速度自然就狂跌 。

 

2.家常索引

打算:提高查询速度

#建表时创建普通索引
create table `table_name`(
    `name` char(50) not null,
    index [index_name] (`name`)
);

#创建普通索引
create index index_name on table_name (name);

#删除普通索引
drop index index_name from table_name;

#查看索引
show indx from table_name;

开查询缓存

  大多数之MySQL服务器都被了查询缓存。这是提高性最有效之道有,而且就是受MySQL的数据库引擎处理的。当起多一如既往的查询被实施了累累之早晚,这些查询结果会吃放置一个缓存中,这样,后续之一样的查询就绝不操作表而直白看缓存结果了。

  第一步把query_cache_type设置也ON,然后查询系统变量have_query_cache是否可用:

show variables like 'have_query_cache'

  之后,分配内存大小为查询缓存,控制缓存查询结果的极其深价值。相关操作以布局文件中开展修改。

 

3.唯一索引

打算:唯一约束与提高查询速度

#建表时创建唯一索引
create table `table_name`(
    `name` char(50) not null,
    unique [index_name] (`name`)
);

#创建唯一索引
create unique index index_name on table_name (name);

#删除唯一索引
drop unique index index_name from table_name;