第39天打卡:3.14 晴 元气满满
昨天出去散心了晚上也没有回校区鸽了一天~
今天把项目前置的几个技术学了下,明天项目正式开工了,离我滚去实习开始进入倒数了,项目写完之际就是我开始打工的开始了。
今日总结:
SQL优化:
索引语法:
创建:create [unique/fulltext] index idx_xxx_xxx on tbl_xxx(字段)
查询:show index from tbl_xxx
删除:drop index idx_xxx on tbl_xxx
unique为唯一索引、fulltext为全文索引、当创建索引语句中有多个字段时创建联合索引。
索引失效情况:
1)在联合索引中,创建索引的顺序是有讲究的(最左前缀法则),举例:
create idx idx_name_age_sex on tbl_user(name,age,sex);
name即为最左,当查询语句的where条件中没有出现name不会使用联合索引即索引失效。当查询语句的where条件中有name和sex时索引长度会减少即只使用了name的索引,age的索引跳过那么sex的所以会失效。如果where条件中有name和age则这两个索引都会被使用。
2)范围查询(<,>):where条件中出现范围查询时,右边列的索引会失效,举例:
select * from tbl_user where name=’张三’and age>30 and sex=‘男’;
其中sex的索引会失效。
3)在索引上进行运算操作时索引会失效,举例(phone字段有单例索引):
select * from tbl_user where substring(phone,10,2);
这条语句会走全表扫描而不走索引。
4)查询条件的字段是字符串类型时不加引号,索引会失效。
5)模糊查询中,头部模糊匹配索引会失效,举例:
select * from tbl_user where name like ’%三’;
6)查询条件使用or时两侧的列必须都有索引,一侧有一侧没有索引会失效。
SQL提示:
查询时MySQL会自动评估,是走全表扫描快还是走索引快,智能选择。
建议使用:MySQL有自己的想法使用下列语法给它提建议,用不用它说了算。举例:select * from tbl_user use index(索引名) where name=’张三’;
忽略使用:不让MySQL使用规定的索引。
举例:select * from tbl_user ignore index(索引名) where name=’张三’;
强制使用:不让MySQL有想法,就得给我用规定的索引!
举例:select * from tbl_user force index(索引名) where name=’张三’;
覆盖索引:查询中使用了索引并且返回值是索引的列,在索引中可以全部找到
不要使用select *。简单来说就是让索引走一次就能找到所有数据,不要进行回表查询.举例:
select id,name,age from tbl_user where name=’xx’;
在这条语句中,name字段有索引,那么在查询时直接走二级索引找到符合条件的叶子节点拿到的数据就是对应id,都可以显示出来不用再去聚集索引中查询。
select id,name,phone from tbl_user where name=’xx’;
在这条语句中,根据同上的过程,name和id都能找到,phone找不到,那么会拿着从二级索引中找到的id回到聚集索引中拿到id的一整行数据,再从这一行数据中提取phone的数据。这个过程扫描了二级索引和聚集索引,称为回表查询。查询性能相对降低。
使用select *很容易造成回表查询,除非建立一个全表字段的联合索引。
面试题:对下列sql进行优化,怎么提升查询性能
select id,username,password from tbl_user where username=’zhangsan’;
答案:建立username和password的联合索引。
fastjson:可以将对象集合等转换成json形式,可以相互转换。
HttpClient:
这个东西说实话有点懵,好像是可以通过一个url通过编程的方式拿到这个url中的数据,分为get和post方式。Get是直接获取,post需要在结尾拼接参数。