zoukankan      html  css  js  c++  java
  • mysql数据库优化课程---18、mysql服务器优化(mysql存在索引但是不使用索引的情况有哪些?)

    mysql数据库优化课程---18、mysql服务器优化(mysql存在索引但是不使用索引的情况有哪些?)

    一、总结

    一句话总结:

    都会取到:如果MySQL估计使用索引比全表扫描更慢,则不使用索引。
    MEMORY/HEAP表 + where条件中不使用“=”进行索引列:如果使用MEMORY/HEAP表并且where条件中不使用“=”进行索引列,那么不会用到索引。Heap表只有在“=”的条件下会使用索引。
    or:用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。

    (1)如果MySQL估计使用索引比全表扫描更慢,则不使用索引。例如如果

    列key_part1均匀分布在1到100之间,查询时使用索引就不是很好

    也就是比如取1-100条,因为这100条都会被取到,所以用不用索引没有什么意义

    (2)如果使用MEMORY/HEAP表并且where条件中不使用“=”进行索引

    列,那么不会用到索引。Heap表只有在“=”的条件下会使用索引。

    (3)用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没

    有索引,那么涉及的索引都不会被用到


    mysql>show index from salesG
    *************************** 1. row ***************************
    … …
    key_name: ind_sales_year
    seq_in_index:1
    Column_name: year
    … …

    2、数据类型:如果列类型是字符串,但在查询时把一个数值型常量赋值给了一个字符型的列名name,索引会用上么?

    不会:那么虽然在name列上有索引,但是也没有用上,所以要注意查询时候的数据类型

    那么虽然在name列上有索引,但是也没有用上,所以要注意查询时候的数据类型

    sql>。 explain select * from company2 where name
    name=294G
    *************************** 1. row ***************************
    id: 1
    select_type: SIMPLE
    table: company2
    type: ALL
    possible_keys: ind_company2_name
    key: NULL
    key_len: NULL
    ref: NULL
    rows: 1000
    Extra: Using where
    1 row in set (0.00 sec)

    字段和值类型不同:
    #desc select * from user where username=200G
    当条件中字段和值的类型不同时,该字段的索引可能会失效.

    3、如何查看索引的使用情况?

    show status:show status like 'Handler_read%';
    Handler_read_rnd_next:Handler_read_rnd_next的值高则意味着查询运行低效,并且应该建立索引补救。
    Handler_read_key:如果索引正在工作,Handler_read_key的值将很高,这个值代表了一个行被索引值读的次数。

    如果索引正在工作Handler_read_key的值将很高,
    这个值代表了一个行被索引值读的次数。
    Handler_read_rnd_next的值高则意味着查询运行低效
    ,并且应该建立索引补救。
    mysql> show status like 'Handler_read%';
    +-----------------------+-------+
    | Variable_name | Value |
    +-----------------------+-------+
    | Handler_read_first | 0 |
    | Handler_read_key | 5 |
    | Handler_read_next | 0 |
    | Handler_read_prev | 0 |
    | Handler_read_rnd | 0 |
    | Handler_read_rnd_next | 2055 |
    +-----------------------+-------+
    6 rows in set (0.00 sec)

    查看索引的使用频次:
    mysql> show status like "%Handler_read%";
    +-----------------------+-------+
    | Variable_name         | Value |
    +-----------------------+-------+
    | Handler_read_key      | 42    |    #越大越好
    | Handler_read_rnd_next | 306   |    #越小越好
    +-----------------------+-------+

    4、如何解决嵌套查询索引可能失效的问题?

    链接查询:可以使用更有效的链接查询(Join)替代

    可以使用更有效的链接查询(Join)替代

    普通多表查询索引也用的上

    mysql5.1版本嵌套查询索引可能失效,5.7版本优化了,好像不会失效了

    5、多表查询有哪些?

    嵌套查询
    普通多表查询
    链接查询

    6、mysql5.7对多表查询的支持情况怎样?

    索引优化:目前5.7的版本中常用的多表查询都进行索引优化.

    #desc select * from t1 where class_id in(select id from class)G
    #desc select t1.* from t1,class where t1.class_id=class.idG
    #desc select t1.* from class left join t1 on t1.class_id=class.idG
    目前5.7的版本中常用的多表查询都进行索引优化.

    7、mysql root密码如何破解?

    密码没忘记情况:set password:set password=password('123');
    密码忘记了的情况:1)关闭mysql服务;2)越过user表启动mysql;3)关闭win下任务管理器中mysqld进程

    1.密码没有忘,但我要改密码
    set password=password('123');

    2.密码忘记了,我要破解密码
    1)关闭mysql服务
    net stop mysql57

    2)越过user表启动mysql
    a.越过授权表启动mysql母进程
    cd AppServMySQLin
    mysqld.exe --skip-grant-tables &

    b.无密码登录
    mysql -uroot

    c.刷新管理员权限
    flush privileges;

    d.有权限后改密码
    alter user 'root'@'localhost' identified by '789';

    3)关闭win下任务管理器中mysqld进程

    4)重新启动mysql服务
    net start mysql57

    二、内容在总结中

    check表检查:
    mysql> check table v_user;
    ---------------------------------------------------------------------------+
    | yzmedu.v_user | check | Error    | Table 'yzmedu.class' doesn't exist
                                                                               |
    | yzmedu.v_user | check | Error    | View 'yzmedu.v_user' references invalid table(s) or c
    olumn(s) or function(s) or definer/invoker of view lack rights to use them |
    | yzmedu.v_user | check | error    | Corrupt
                                                                               |
    ---------------------------------------------------------------------------+

    索引的存储分类:
    1.myisam
    1)frm 表结构
    2)myd 表数据
    3)myi 表索引

    2.innodb
    1)frm 表结构
    2)ibd 索引+部分表数据
    3)ibdata1 所有表共享空间

    复合索引:
    对于创建的多列索引,只要查询的条件中用到最左边的列,索引一般就会被使用.

    like关键字:
    #desc select * from user where username like 'linux%'G
    当使用like进行搜索时,%在前索引可能会失效.

    null判断:
    #desc select * from user where username is null;
    当判断null值时会使用username这一列的索引.

    or关键字:
    #desc select * from user where username='user7' or age=15G
    在使用or的情况下两边的索引都有可能失效.

    字段和值类型不同:
    #desc select * from user where username=200G
    当条件中字段和值的类型不同时,该字段的索引可能会失效.

    查看索引的使用频次:
    mysql> show status like "%Handler_read%";
    +-----------------------+-------+
    | Variable_name         | Value |
    +-----------------------+-------+
    | Handler_read_key      | 42    |    #越大越好
    | Handler_read_rnd_next | 306   |    #越小越好
    +-----------------------+-------+

    多表查询索引使用:
    #desc select * from t1 where class_id in(select id from class)G
    #desc select t1.* from t1,class where t1.class_id=class.idG
    #desc select t1.* from class left join t1 on t1.class_id=class.idG
    目前5.7的版本中常用的多表查询都进行索引优化.

    Mysql服务器优化:
    1.四种字符集问题
    2.slow log慢查询日志问题
    3.root密码丢失

    mysql root密码破解:
    1.密码没有忘,但我要改密码
    set password=password('123');

    2.密码忘记了,我要破解密码
    1)关闭mysql服务
    net stop mysql57

    2)越过user表启动mysql
    a.越过授权表启动mysql母进程
    cd AppServMySQLin
    mysqld.exe --skip-grant-tables &

    b.无密码登录
    mysql -uroot

    c.刷新管理员权限
    flush privileges;

    d.有权限后改密码
    alter user 'root'@'localhost' identified by '789';

    3)关闭win下任务管理器中mysqld进程

    4)重新启动mysql服务
    net start mysql57











     
  • 相关阅读:
    easy ui 表单ajax和from两种提交数据方法
    easy ui 下拉级联效果 ,下拉框绑定数据select控件
    easy ui 下拉框绑定数据select控件
    easy ui 异步上传文件,跨域
    easy ui 菜单和按钮(Menu and Button)
    HTTP 错误 404.3
    EXTJS4.2 后台管理菜单栏
    HTML 背景图片自适应
    easy ui 表单元素input控件后面加说明(红色)
    EXTJS 4.2 添加滚动条
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/9843821.html
Copyright © 2011-2022 走看看