阅读目录

===========================================================================================================================================

一.介绍

为何要有索引?

一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起加速查询,就不得不提到索引了。

什么是索引?

索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能
非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。
索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。
索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。

二.索引的原理                                                            回到顶部

本质都是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。

三.索引的数据结构                                                          回到顶部

我们需要这种数据结构能够做些什么,其实很简单,那就是:每次查找数据时把磁盘IO次数控制在一个很小的数量级,最好是常数数量级。那么我们就想到如果一个高度可控的多路搜索树是否能满足需求呢?就这样,b+树应运而生。

如上图,是一颗b+树,关于b+树的定义可以参见B+树,这里只说一些重点,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),如磁盘块1包含数据项17和35,包含指针P1、P2、P3,P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。真实的数据存在于叶子节点即3、5、9、10、13、15、28、29、36、60、75、79、90、99。非叶子节点只不存储真实的数据,只存储指引搜索方向的数据项,如17、35并不真实存在于数据表中。

###b+树的查找过程
如图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。

###b+树性质
1.索引字段要尽量的小:通过上面的分析,我们知道IO次数取决于b+数的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则有h=㏒(m+1)N,当数据量N一定的情况下,m越大,h越小;而m = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低。这就是为什么每个数据项,即索引字段要尽量的小,比如int占4字节,要比bigint8字节少一半。这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节点,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。当数据项等于1时将会退化成线性表。
2.索引的最左匹配特性:当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。

三.MySQL索引管理                                                         回到顶部

一.功能

  1. #1. 索引的功能就是加速查找
  2. #2. mysql中的primary key,unique,联合唯一也都是索引,这些索引除了加速查找以外,还有约束的功能

二.MySQL的索引分类

  1. 普通索引index:加速查找
  2.  
  3. 唯一索引:
  4. -主键索引primary key:加速查找+约束(不为空、不能重复)
  5. -唯一索引unique:加速查找+约束(不能重复)
  6.  
  7. 联合索引:
  8. -primary key(id,name):联合主键索引
  9. -unique(id,name):联合唯一索引
  10. -index(id,name):联合普通索引
  1. 举个例子来说,比如你在为某商场做一个会员卡的系统。
  2.  
  3. 这个系统有一个会员表
  4. 有下列字段:
  5. 会员编号 INT
  6. 会员姓名 VARCHAR(10)
  7. 会员身份证号码 VARCHAR(18)
  8. 会员电话 VARCHAR(10)
  9. 会员住址 VARCHAR(50)
  10. 会员备注信息 TEXT
  11.  
  12. 那么这个 会员编号,作为主键,使用 PRIMARY
  13. 会员姓名 如果要建索引的话,那么就是普通的 INDEX
  14. 会员身份证号码 如果要建索引的话,那么可以选择 UNIQUE (唯一的,不允许重复)
  15.  
  16. #除此之外还有全文索引,即FULLTEXT
  17. 会员备注信息 如果需要建索引的话,可以选择全文搜索。
  18. 用于搜索很长一篇文章的时候,效果最好。
  19. 用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。
  20. 但其实对于全文搜索,我们并不会使用MySQL自带的该索引,而是会选择第三方软件如Sphinx,专门来做全文搜索。
  21.  
  22. #其他的如空间索引SPATIAL,了解即可,几乎不用

各个索引的应用场景

三.索引的两大类型 hash与btree

  1. #我们可以在创建上述索引的时候,为其指定索引类型,分两类
  2. hash类型的索引:查询单条快,范围查询慢
  3. btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)
  4.  
  5. #不同的存储引擎支持的索引类型也不一样
  6. InnoDB 支持事务,支持行级别锁定,支持 B-treeFull-text 等索引,不支持 Hash 索引;
  7. MyISAM 不支持事务,支持表级别锁定,支持 B-treeFull-text 等索引,不支持 Hash 索引;
  8. Memory 不支持事务,支持表级别锁定,支持 B-treeHash 等索引,不支持 Full-text 索引;
  9. NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-treeFull-text 等索引;
  10. Archive 不支持事务,支持表级别锁定,不支持 B-treeHashFull-text 等索引;

四.创建/删除索引的语法

  1. #方法一:创建表时
  2.   CREATE TABLE 表名 (
  3. 字段名1 数据类型 [完整性约束条件…],
  4. 字段名2 数据类型 [完整性约束条件…],
  5. [UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
  6. [索引名] (字段名[(长度)] [ASC |DESC])
  7. );
  8.  
  9. #方法二:create在已存在的表上创建索引
  10. create [unique | fulltext| spatial ] index 索引名
  11. on 表名 (字段名[(长度)] [asc |desc]) ;
  12.  
  13. #方法三:alter table在已存在的表上创建索引
  14. alter table 表名 add [unique | fulltext | spatial ] index
  15. 索引名 (字段名[(长度)] [asc|desc) ;
  16.  
  17. #删除索引:drop index 索引名 on表名字;

四.测试索引                                                            回到顶部

1.准备

  1. #1. 准备表
  2. create table s1(
  3. id int,
  4. name varchar(20),
  5. gender char(6),
  6. email varchar(50)
  7. );
  8.  
  9. #2. 创建存储过程,实现批量插入记录
  10. delimiter $$ #声明存储过程的结束符号为$$
  11. create procedure auto_insert1()
  12. BEGIN
  13. declare i int default 1;
  14. while(i<3000000)do
  15. insert into s1 values(i,concat('egon',i),'male',concat('egon',i,'@oldboy'));
  16. set i=i+1;
  17. end while;
  18. END$$ #$$结束
  19. delimiter ; #重新声明分号为结束符号
  20.  
  21. #3. 查看存储过程
  22. show create procedure auto_insert1\G
  23.  
  24. #4. 调用存储过程
  25. call auto_insert1();

2.在没有索引的前提下测试查询速度

  1. #无索引:从头到尾扫描一遍,所以查询速度很慢
  2. mysql> select * from s1 where id=333;
  3. +------+---------+--------+----------------+
  4. | id | name | gender | email |
  5. +------+---------+--------+----------------+
  6. | 333 | egon333 | male | 333@oldboy.com |
  7. | 333 | egon333 | f | alex333@oldboy |
  8. | 333 | egon333 | f | alex333@oldboy |
  9. +------+---------+--------+----------------+
  10. rows in set (0.32 sec)
  11.  
  12. mysql> select * from s1 where email='egon333@oldboy';
  13. ....
  14. ... rows in set (0.36 sec)

3.加上索引

  1. #1. 一定是为搜索条件的字段创建索引,比如select * from t1 where age > 5;就需要为age加上索引
  2.  
  3. #2. 在表中已经有大量数据的情况下,建索引会很慢,且占用硬盘空间,插入删除更新都很慢,只有查询快
  4. 比如create index idx on s1(id);会扫描表中所有的数据,然后以id为数据项,创建索引结构,存放于硬盘的表中。
  5. 建完以后,再查询就会很快了
  6.  
  7. #3. 需要注意的是:innodb表的索引会存放于s1.ibd文件中,而myisam表的索引则会有单独的索引文件table1.MYI

ps:我们可以去mysql的data目录下找到该表,可以看到占用的硬盘空间多了

五.正确使用索引                                                          回到顶部

一.并不是说我们创建了索引就一定会加快查询速度,如下索引则未命中

  1. select sql_no_cache * from s1 where email='xxx'; #命中索引,速度很快
  2. select sql_no_cache * from s1 where email like '%old%'; #无法使用索引,速度依然很慢

二.覆盖索引与索引合并

  1. #覆盖索引:
  2. - 在索引文件中直接获取数据
  3. http://blog.itpub.net/22664653/viewspace-774667/
  4.  
  5. #分析
  6. select * from s1 where id=123;
  7. sql命中了索引,但未覆盖索引。
  8. 利用id=123到索引的数据结构中定位到该id在硬盘中的位置,或者说再数据表中的位置。
  9. 但是我们select的字段为*,除了id以外还需要其他字段,这就意味着,我们通过索引结构取到id还不够,还需要利用该id再去找到该id所在行的其他字段值,这是需要时间的,很明显,如果我们只select id,就减去了这份苦恼,如下
  10. select id from s1 where id=123;
  11. 这条就是覆盖索引了,命中索引,且从索引的数据结构直接就取到了id在硬盘的地址,速度很快
  1. #索引合并:把多个单列索引合并使用
  2.  
  3. #分析:
  4. 组合索引能做到的事情,我们都可以用索引合并去解决,比如
  5. create index ne on s1(name,email);#组合索引
  6. 我们完全可以单独为nameemail创建索引
  7.  
  8. 组合索引可以命中:
  9. select * from s1 where name='egon' ;
  10. select * from s1 where name='egon' and email='adf';
  11.  
  12. 索引合并可以命中:
  13. select * from s1 where name='egon' ;
  14. select * from s1 where email='adf';
  15. select * from s1 where name='egon' and email='adf';
  16.  
  17. 乍一看好像索引合并更好了:可以命中更多的情况,但其实要分情况去看,如果是name='egon' and email='adf',那么组合索引的效率要高于索引合并,如果是单条件查,那么还是用索引合并比较合理

三.如若想利用索引达到预想的提高查询速度的效果,我们在添加索引时,必须遵循以下原则

  1. #1.最左前缀匹配原则,非常重要的原则,
  2. create index ix_name_email on s1(name,email,)
  3. - 最左前缀匹配:必须按照从左到右的顺序匹配
  4. select * from s1 where name='egon'; #可以
  5. select * from s1 where name='egon' and email='asdf'; #可以
  6. select * from s1 where email='alex@oldboy.com'; #不可以
  7. mysql会一直向右匹配直到遇到范围查询(>、<、betweenlike)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
  8.  
  9. #2.=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式
  10.  
  11. #3.尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录
  12.  
  13. #4.索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);
  14.  
  15. #5.尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可

最左前缀示范

  1. mysql> select * from s1 where id>3 and name='egon' and email='alex333@oldboy.com' and gender='male';
  2. Empty set (0.39 sec)
  3.  
  4. mysql> create index idx on s1(id,name,email,gender); #未遵循最左前缀
  5. Query OK, 0 rows affected (15.27 sec)
  6. Records: 0 Duplicates: 0 Warnings: 0
  7.  
  8. mysql> select * from s1 where id>3 and name='egon' and email='alex333@oldboy.com' and gender='male';
  9. Empty set (0.43 sec)
  10.  
  11. mysql> drop index idx on s1;
  12. Query OK, 0 rows affected (0.16 sec)
  13. Records: 0 Duplicates: 0 Warnings: 0
  14.  
  15. mysql> create index idx on s1(name,email,gender,id); #遵循最左前缀
  16. Query OK, 0 rows affected (15.97 sec)
  17. Records: 0 Duplicates: 0 Warnings: 0
  18.  
  19. mysql> select * from s1 where id>3 and name='egon' and email='alex333@oldboy.com' and gender='male';
  20. Empty set (0.03 sec)

索引无法命中的情况需要注意

  1. - like '%xx'
  2. select * from tb1 where email like '%cn';
  3.  
  4. - 使用函数
  5. select * from tb1 where reverse(email) = 'wupeiqi';
  6.  
  7. - or
  8. select * from tb1 where nid = 1 or name = 'seven@live.com';
  9.  
  10. 特别的:当or条件中有未建立索引的列才失效,以下会走索引
  11. select * from tb1 where nid = 1 or name = 'seven';
  12. select * from tb1 where nid = 1 or name = 'seven@live.com' and email = 'alex'
  13.  
  14. - 类型不一致
  15. 如果列是字符串类型,传入条件是必须用引号引起来,不然...
  16. select * from tb1 where email = 999;
  17.  
  18. 普通索引的不等于不会走索引
  19. - !=
  20. select * from tb1 where email != 'alex'
  21.  
  22. 特别的:如果是主键,则还是会走索引
  23. select * from tb1 where nid != 123
  24. - >
  25. select * from tb1 where email > 'alex'
  26.  
  27. 特别的:如果是主键或索引是整数类型,则还是会走索引
  28. select * from tb1 where nid > 123
  29. select * from tb1 where num > 123
  30.  
  31. #排序条件为索引,则select字段必须也是索引字段,否则无法命中
  32. - order by
  33. select name from s1 order by email desc;
  34. 当根据索引排序时候,select查询的字段如果不是索引,则不走索引
  35. select email from s1 order by email desc;
  36. 特别的:如果对主键排序,则还是走索引:
  37. select * from tb1 order by nid desc;
  38.  
  39. - 组合索引最左前缀
  40. 如果组合索引为:(name,email)
  41. name and email -- 使用索引
  42. name -- 使用索引
  43. email -- 不使用索引
  44.  
  45. - count(1)或count(列)代替count(*)在mysql中没有差别了
  46.  
  47. - create index xxxx on tb(title(19)) #text类型,必须制定长度

其他注意事项

  1. —避免使用select *
  2. count1)或count(列) 替代 count(*)
  3. —创建表时尽量char 替代 varchar
  4. —表的字段顺序固定长度的字段优先
  5. —组合索引替代多个单列索引(经常使用多个条件查询时)
  6. —尽量使用短索引
  7. —使用连接(join 来替代子查询(sub-queries
  8. —连表时需要注意条件类型需要一致
  9. —索引散列值(重复少)不适合建索引,例:性别不合适

六.查询优化神器--explain                                                      回到顶部

关于explain命令相信大家并不陌生,具体用法和字段含义可以参考官网explain-output,这里需要强调rows是核心指标,绝大部分rows小的语句执行一定很快(有例外,下面会讲到)。所以优化语句基本上都是在优化rows。

  1. 执行计划:让mysql预估执行操作(一般正确)
  2. all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const
  3. id,email
  4.  
  5. 慢:
  6. select * from userinfo3 where name='alex'
  7.  
  8. explain select * from userinfo3 where name='alex'
  9. type: ALL(全表扫描)
  10. select * from userinfo3 limit 1;
  11. 快:
  12. select * from userinfo3 where email='alex'
  13. type: const(走索引)

七.慢查询优化的基本步骤                                                      回到顶部

  1. 0.先运行看看是否真的很慢,注意设置SQL_NO_CACHE
  2. 1.where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高
  3. 2.explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)
  4. 3.order by limit 形式的sql语句让排序的表优先查
  5. 4.了解业务方使用场景
  6. 5.加索引时参照建索引的几大原则
  7. 6.观察结果,不符合预期继续从0分析

八.慢日志管理                                                           回到顶部

  1. 慢日志
  2. - 执行时间 > 10
  3. - 未命中索引
  4. - 日志文件路径
  5.  
  6. 配置:
  7. - 内存
  8. show variables like '%query%';
  9. show variables like '%queries%';
  10. set global 变量名 =
  11. - 配置文件
  12. mysqld --defaults-file='E:\wupeiqi\mysql-5.7.16-winx64\mysql-5.7.16-winx64\my-default.ini'
  13.  
  14. my.conf内容:
  15. slow_query_log = ON
  16. slow_query_log_file = D:/....
  17.  
  18. 注意:修改配置文件之后,需要重启服务
  1. MySQL日志管理
  2. ========================================================
  3. 错误日志: 记录 MySQL 服务器启动、关闭及运行错误等信息
  4. 二进制日志: 又称binlog日志,以二进制文件的方式记录数据库中除 SELECT 以外的操作
  5. 查询日志: 记录查询的信息
  6. 慢查询日志: 记录执行时间超过指定时间的操作
  7. 中继日志: 备库将主库的二进制日志复制到自己的中继日志中,从而在本地进行重放
  8. 通用日志: 审计哪个账号、在哪个时段、做了哪些事件
  9. 事务日志或称redo日志: 记录Innodb事务相关的如事务执行时间、检查点等
  10. ========================================================
  11. 一、bin-log
  12. 1. 启用
  13. # vim /etc/my.cnf
  14. [mysqld]
  15. log-bin[=dir\[filename]]
  16. # service mysqld restart
  17. 2. 暂停
  18. //仅当前会话
  19. SET SQL_LOG_BIN=0;
  20. SET SQL_LOG_BIN=1;
  21. 3. 查看
  22. 查看全部:
  23. # mysqlbinlog mysql.000002
  24. 按时间:
  25. # mysqlbinlog mysql.000002 --start-datetime="2012-12-05 10:02:56"
  26. # mysqlbinlog mysql.000002 --stop-datetime="2012-12-05 11:02:54"
  27. # mysqlbinlog mysql.000002 --start-datetime="2012-12-05 10:02:56" --stop-datetime="2012-12-05 11:02:54"
  28.  
  29. 按字节数:
  30. # mysqlbinlog mysql.000002 --start-position=260
  31. # mysqlbinlog mysql.000002 --stop-position=260
  32. # mysqlbinlog mysql.000002 --start-position=260 --stop-position=930
  33. 4. 截断bin-log(产生新的bin-log文件)
  34. a. 重启mysql服务器
  35. b. # mysql -uroot -p123 -e 'flush logs'
  36. 5. 删除bin-log文件
  37. # mysql -uroot -p123 -e 'reset master'
  38.  
  39. 二、查询日志
  40. 启用通用查询日志
  41. # vim /etc/my.cnf
  42. [mysqld]
  43. log[=dir\[filename]]
  44. # service mysqld restart
  45.  
  46. 三、慢查询日志
  47. 启用慢查询日志
  48. # vim /etc/my.cnf
  49. [mysqld]
  50. log-slow-queries[=dir\[filename]]
  51. long_query_time=n
  52. # service mysqld restart
  53. MySQL 5.6:
  54. slow-query-log=1
  55. slow-query-log-file=slow.log
  56. long_query_time=3
  57. 查看慢查询日志
  58. 测试:BENCHMARK(count,expr)
  59. SELECT BENCHMARK(50000000,2*3);

日志管理

MySQL ——索引原理与慢查询优化(Day45)的更多相关文章

  1. MySQL索引原理及慢查询优化-来自美团网的技术blog(写的深入浅出)

    MySQL索引原理及慢查询优化 转:http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首 ...

  2. day--41 mysql索引原理与慢查询优化

    mysql索引原理与慢查询优化一:什么是索引 01:索引的出现是为了提高查询数据的效率 02:索引在mysql叫做“键” 或则“key“(primary key,uniquekey ,还有一个inde ...

  3. python 3 mysql 索引原理与慢查询优化

    python 3 mysql 索引原理与慢查询优化 一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最 ...

  4. MySQL 索引原理以及慢查询优化

    本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree ...

  5. MySQL索引原理及慢查询优化

    原文:http://tech.meituan.com/mysql-index.html 一个慢查询引发的思考 select count(*) from task where status=2 and ...

  6. (转)MySQL索引原理及慢查询优化

    转自美团技术博客,原文地址:http://tech.meituan.com/mysql-index.html 建索引的一些原则: 1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到 ...

  7. MySQL索引原理及慢查询优化 转载

    原文地址: http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能 ...

  8. MySQL索引原理及慢查询优化(转)

    add by zhj:这是美团点评技术团队的一篇文章,讲的挺不错的. 原文:http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰 ...

  9. 【转载】MySQL索引原理及慢查询优化

    原文链接:美团点评技术团队:http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型 ...

  10. MySQL索引原理与慢查询优化

    索引目的 索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql.如果没有索引,那么你可能需要把所有单词看一遍才 ...

随机推荐

  1. Fly (From Wikipedia)

    True flies are insects of the order Diptera, the name being derived from the Greek δι- di- "two ...

  2. 如何使用VMWare共享Win7中的文件夹,对应Linux中的哪个目录下面?

    访问 /mnt/hgfs/你设置的共享名,如果找不到这个hgfs这个文件夹,那说明你还没正确安装好 install VMware tools

  3. 基于Redis实现延迟队列

    背景 在后端服务中,经常有这样一种场景,写数据库操作在异步队列中执行,且这个异步队列是多进程运行的,这时如果对同一资源进行写库操作,很有可能产生数据被覆盖等问题,于是就需要业务层在更新数据库之前进行加 ...

  4. php ocket通信机制

    php 实例说明 socket通信机制 一,socket是什么 什么是socket 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通 ...

  5. Linux系统常用工具集

    整理Linux系统下一些日常工作中常用工具,旨在提高效率: 1.截图软件Shutter 2.通讯聊天工具pidgin 3.守护进程工具daemontools 4.远程桌面服务TigerVNC 5.Ma ...

  6. structure machine learning projects 课程笔记

    orthogonalization/ one metric train.dev/test 划分 开发集和测试集一定来自同一分布  onthe  same distribution Human leve ...

  7. ajax利用html5新特性带进度条上传文件

    http://blog.csdn.net/pkgray/article/details/27591283 http://www.matlus.com/html5-file-upload-with-pr ...

  8. JDBC批量操作性能提升

    JDBC 当使用INSERT INTO....VALUES()语句批量插入的时候,应该使用JDBC的PreparedStatement的批量操作方法,而不是採用一条一条运行的方法. 比如(来源:htt ...

  9. 面试题思考:什么是基于注解的切面实现?(AOP是Aspect Oriented Program的首字母缩写)

    首先解释下AOP :在程序运行时,动态的将代码切入到类的指定方法.指定位置上的编程思想就是面向切面编程 一般而言,我们管切入到指定类指定方法的代码片段为切面,而切入的哪些类.哪些方法则叫切入点.有了A ...

  10. 使用HTML5构建iOS原生APP(2)

    本文转载至 http://ju.outofmemory.cn/entry/18807 有时候我们在内嵌的webview中希望点击一个链接之后,触发iOS原生事件,而不是webview内页面跳转(因为w ...