年底面试总结第一天

mysql 优化

   一:数据库级别优化
          表结构是否正确,判断是否有正确的数据类型
          判断是否安装正确的索引 以提高查询效率
          判断每个表是否使用了正确的存储引擎。innoDB是默认存储引擎
          在 MySQL 中有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊
          MyISAM表索引在处理文本索引时更具优势,而INNODB表索引在其它类型上更具效率优势。
          比如全文索引一般在CHAR、VARCHAR或TEXT列上创建,MyISAM表支持而INNODB表不支持,
          常见主要针对 文本进行索引。同时MySQL  高并发需要事务场景时,只能使用INNODB表。
          因为MyISAM相对简单所以在效率上要优于InnoDB.如果系统读多,写少`在这里插入代码片`。对原子性要求低。
          那么MyISAM最好的选择。且MyISAM恢复速度快。可直接用备份覆盖恢复。 
          如果系统读少,写多的时候,尤其是并发写入高的时候。InnoDB就是首选了。 
          my.ini文件中可以更该使用存储引擎
   二:Sql语句优化
         避免 SELECT *  ,从数据库里读出越多的数据,那么查询就会变得越慢;
         永远为每张表设置一个 ID
         当只要一行数据时使用 LIMIT 1
         不要写一些没有意义的查询,如需要生成一个空表结构
         尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
         对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
         等等

索引类型

       使用解释函数explain,只需添加在sql语句之前即可  
  • 普通索引

        这是最基本的索引,它没有任何限制,比如上文中为title字段创建的索引就是一个普通索引,
        MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引
    
  • 唯一索引

     与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。
     如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。
    
  • 全文索引(FULLTEXT)

    MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;
    他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,
    或是随后使用ALTER TABLE 或CREATE INDEX被添加。对于较大的数据集,
    将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,
    其速度比把资料输入现有 FULLTEXT索引的速度更为快。
    不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
    

上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。下面是一些总结以及收藏的MySQL索引的注意事项和优化方法。

1. 何时使用聚集索引或非聚集索引?

动作描述 使用聚集索引 使用非聚集索引
列经常被分组排序 使用 使用
返回某范围内的数据 使用 不使用
一个或极少不同值 不使用 不使用
小数目的不同值 使用 不使用
大数目的不同值 不使用 使用
频繁更新的列 不使用 使用
外键列 使用 使用
主键列 使用 使用
频繁修改索引列 不使用 使用
事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如:返回某范围内的数据一项。比如您的某个表有一个时间列,恰好您把聚合索引建立在了该列,这时您查询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可;而不像非聚集索引,必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体内容。其实这个具体用法我还不是很理解,只能等待后期的项目开发中慢慢学学了。

  1. 索引不会包含有NULL值的列

只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

  1. 使用短索引

对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

  1. 索引列排序

MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

  1. like语句操作

一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

  1. 不要在列上进行运算

例如:select * from users where YEAR(adddate)<2007,将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:select * from users where adddate<’2007-01-01′。关于这一点可以围观:一个单引号引发的MYSQL性能损失。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Da.ge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值