企业网站建设流程步骤,vs做网站示例,wordpress的修改后主题后台出现已损坏的修复,教你如何做网络营销推广内连接 -- inner join内连接在不加on的情况下, 也是去求笛卡尔乘积. 不加on的用法并不推荐使用, 容易造成内存溢出的情况. 加on的时候, 在连表的时候, 就会对数据进行筛选, 以此来缩减有效数据范围。select * from A inner join B;  select * from A,B; //交叉连接 -- 笛卡尔乘…内连接 -- inner join内连接在不加on的情况下, 也是去求笛卡尔乘积. 不加on的用法并不推荐使用, 容易造成内存溢出的情况. 加on的时候, 在连表的时候, 就会对数据进行筛选, 以此来缩减有效数据范围。select * from A inner join B;  select * from A,B; //交叉连接 -- 笛卡尔乘积  cross joinA的条数 * B的条数select * from A,B where A.uidB.m_uid;    select * from A inner join B as b on A.uidB.m_uid;    //交叉连接 -- 笛卡尔乘积外连接 -- left/right join on这里加了一个on在上面, 因为不加on是会报错的.left join 称之为左连接, 连接以左侧表数据为准, 当右表没有数据与之匹配的时候, 则会用null填补right join 称之为右连接, 与 left join 相反, 这个是以右表为准.常用索引主键(唯一索引并且是主键一张表智能有一个主键索引PRIMARY KEYAUTO_INCREMENT自增主键)唯一索引比方说身份证号 、手机号、登录用户名  必须不同可以为空      create UNIQUE index index_mobile on index_table(mobile);普通索引index (最基础没有特别)  create index index_name on index_table(name);联合索引create index index_union on index_table(name,age,mobile);这里一个组合索引相当于在有如下三个索引namenameagenameagemobile这里或许有这样一个疑惑为什么age或mobile或者agemobile字段上没有索引。这是由于BTree索引因要遵守最左前缀原则。1、选择索引列     where 后面出现的列 或join 后面出现的列注意在建立联合索引时where中没有name 时没有用到索引之前的六种情况都有用到。ABC  AB  AC  BAC  CBA  CAB   A只有BCBC这三种情况不能使用联合索引使用索引情况不在乎顺序。1.最左前缀匹配原则mysql会一直向右匹配直到遇到范围查询(、2.尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*)表示字段不重复的比例比例越大我们扫描的记录数越少。3.当取出的数据超过全表数据的20%时不会使用索引。4.使用like时注意不使用索引like ‘%L%’使用索引like ‘L%’5.尽量将or 转换为 union all不使用索引select * from user where name’a’ or age’20’使用索引select * from user where name’a’ union all select * from user where age’20’6.字段加函数不会使用索引。所以尽量把函数放在数值上不使用索引where truncate(price)  1使用索引where price  1 and price  27.如果使用数字作为字符则数字需要加引号否则mysql会自动在列上加数据类型转换函数不使用索引where mobile18534874321使用索引where mobile’18534874321’8.字段加运算符不会使用索引。所以尽量把运算放在数值上不使用索引:SELECT ACCOUNT_NAME, AMOUNTFROM TRANSACTIONWHERE AMOUNT  3000 5000;使用索引:SELECT ACCOUNT_NAME, AMOUNTFROM TRANSACTIONWHERE AMOUNT  2000 ;9.使用组合索引时必须要包括第一个列。例如alter table test add index(a,b,c)不使用索引where b1, c2where b1where c2使用索引where a1, b1, c2where a1, b1where a1, c210.尽量避免使用is null或is not null不使用索引SELECT …FROM DEPARTMENTWHERE DEPT_CODE IS NOT NULL;使用索引SELECT …FROM DEPARTMENTWHERE DEPT_CODE 0;11.不等于(!)不会使用索引不使用索引:SELECT ACCOUNT_NAMEFROM TRANSACTIONWHERE AMOUNT !0;使用索引:SELECT ACCOUNT_NAMEFROM TRANSACTIONWHERE AMOUNT 0;12.ORDER BY 子句只在以下的条件下使用索引lORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.lORDER BY中不能既有ASC也有DESC例如:alter table t1 add index(a,b);alter table t1 add index(c);不使用索引select * from t1 order by a,c; 不在一个索引中select * from t1 order by b; 没有出现组合索引的第一列select * from t1 order by a asc, b desc; 混合ASC和DESCselect * from t1 where a1 order by c; where和order by用的不是同一个索引where使用索引order by不使用。使用索引select * from t1 order by a,b;select * from t1 order where a1 order by b;select * from t1 order where a1 order by a,b;select * from t1 order by a desc, b desc;select * from t1 where c1 order by c;13.索引不是越多越好。mysql需要资源来维护索引任何数据的变更(增删改)都会连带修改索引的值。所以需要平衡考虑索引带来的查询加速和增删改减速。其他注意事项1.尽量避免使用select *2.尽量使用表连接(join)代替子查询select * from t1 where a in (select b from t2)3.性能方面表连接  (not) exists  (not) in1)用exists代替in低效:SELECT *FROM EMPWHERE EMPNO  0AND DEPTNO IN (SELECT DEPTNOFROM DEPTWHERE LOC  ‘MELB’)高效:SELECT *FROM EMPWHERE EMPNO  0AND EXISTS (SELECT ‘X’FROM DEPTWHERE DEPT.DEPTNO  EMP.DEPTNOAND LOC  ‘MELB’)2)用not exists代替not in低效SELECT …FROM EMPWHERE DEPT_NO NOT IN (SELECT DEPT_NOFROM DEPTWHERE DEPT_CAT’A’);高效SELECT ….FROM EMP EWHERE NOT EXISTS (SELECT ‘X’FROM DEPT DWHERE D.DEPT_NO  E.DEPT_NOAND DEPT_CAT  ‘A’);3)用表连接代替existsexitsSELECT ENAMEFROM EMP EWHERE EXISTS (SELECT ‘X’FROM DEPTWHERE DEPT_NO  E.DEPT_NOAND DEPT_CAT  ‘A’);表连接SELECT ENAMEFROM DEPT D,EMP EWHERE E.DEPT_NO  D.DEPT_NOAND DEPT_CAT  ‘A’ ;4.清除不必要的排序低效select count(*) from (select * from user where id  40 order by id);高效select count(*) from (select * from user where id  40);5.having - where避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销.低效select * from user group by id having id  40;高效select * from user where id  40 group by id;6.除非确实需要去掉重复的行否则尽量使用union all而不是union。因为union会自带distinct操作代价很大使用explain查看sql性能1.explain用法在select之前加上explain即可。例如explain select * from test;注意explain并不会真正运行语句而是只返回执行计划。怎么看执行计划一个简单的优化原则令sql读取尽可能少的行。2.实战案例1问题语句运行超过5sSELECT branch.id, branch.name, branch.registered_time, branch_region.region_id, user.username, user.mobile, count(o.order_id) as order_numFROM (branch)LEFT JOIN user ON user.branch_id  branch.idLEFT JOIN branch_role ON branch_role.id  user.role_idLEFT JOIN branch_region ON branch_region.branch_id  branch_role.branch_idLEFT JOIN orders o ON branch.id  o.supplier_idWHERE branch.id NOT IN (select supplier_id from signing where seller_id6683 and status  6)AND branch.group  SUPPLIERAND branch_role.flag  ADMINISTRATORAND branch.status  NORMALGROUP BY branch.idORDER BY branch.registered_time descLIMIT 20;使用explain查看执行计划根据“读取尽可能少的数据”的原则发现读取行数最多的步骤读取了4792行。进而发现这个步骤没有用到索引(NULL)。而这个没有用索引的表是orders的supplier_id列。加索引试试看alter table orders add index(supplier_id);再次使用explain查看执行计划可以看到这个步骤使用了索引读取的行数减少到了599行。实际执行一下秒出。3.explain执行计划各个字段的意义1)id语句的执行顺序倒序执行2)select_type主要有以下几个类型lsimple表示简单的select没有union和子查询lprimary最外层的select。在有子查询的语句中最外面的select查询就是primarylunionunion语句的第二个或者说是后面那一个lunion resultunion的结果lsubquery: 子查询中的第一个 select3)table涉及的表。4)type连接类型。主要有以下几个(重点查看)lconst说明只有一个匹配行使用了主键或唯一性索引。通常是最优化的情况。leq_refrefref_or_null表示走了简单索引lindex_merge表示使用了多个索引的组合lrange表示通过索引取出了一个范围内的值。例如where a in (1,2)lindex表示对索引进行了全扫描lALL表示全表扫描注意以上类型从上到下性能越来越差。5)possible_keys可供使用的索引6)keys实际使用的索引7)key_gen索引长度8)ref显示使用哪个列或常数与索引一起从表中选择行9)rows读取的行数。(重点查看)10)Extra备注