免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3247 | 回复: 7
打印 上一主题 下一主题

看一个关联查询索引问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-21 16:36 |只看该作者 |倒序浏览


  1. SELECT tt.s_id topic_id,
  2.         tt.s_tags_id tags_id,
  3.         tt.s_title title,
  4.         tt.s_member_id member_id,
  5.         tt.s_reply_amount reply_amount,
  6.         tt.s_read_amount read_amount,
  7.         tt.s_last_update last_update,
  8.         tt.s_add_time add_time,
  9.         tt.s_add_ip add_ip,
  10.         mi.s_face_image member_face_image,
  11.         mm.s_nick_name member_nick_name
  12. FROM ds_w_tags_topic tt,
  13.         ds_w_member mm,
  14.         ds_w_member_information mi
  15. WHERE  tt.s_tags_id=1
  16.         AND tt.s_status=1
  17.         AND tt.s_member_id=mm.s_id
  18.         AND mm.s_id=mi.s_member_id
  19. ORDER BY tt.s_last_update DESC

复制代码


上面是执行的SQL语句,目的是从ds_w_tags_topic表取出帖子和帖子作者的一些信息,作者的信息分两张表存储ds_w_member和ds_w_member_information

现在,在ds_w_tags_topic中对s_member_id做索引,ds_w_member的主键s_id(其他表的s_member_id)索引,ds_w_member_information的s_member_id索引,
ds_w_tags_topic中再对s_tags_id,s_status,s_last_update做了一个组合索引

下面是EXPLAIN对SQL运行分析的结果



  1. id        select_type        table  type        possible_keys                key                key_len                ref                rows                Extra  
  2. 1        SIMPLE                tt        ref        s_member_id,s_tags_id        s_tags_id        5                const,const        2                Using temporary; Using filesort
  3. 1        SIMPLE                mm        ALL        PRIMARY                        NULL                NULL                NULL                2                Using where
  4. 1        SIMPLE                mi        ALL        s_member_id                NULL                NULL                NULL                2                Using where
复制代码


结果显示,只有tt表使用到了索引,而其他两张表均没有使用索引而采用全表扫描,这里想请问针对mm和mi两张表索引的创建方法,谢谢

论坛徽章:
0
2 [报告]
发表于 2007-06-21 17:00 |只看该作者
建议楼主把你的几张表table structure export出来, 作为附件.

论坛徽章:
0
3 [报告]
发表于 2007-06-21 17:29 |只看该作者
你的tt.s_member_id, mm.s_id, mi.s_member_id会不会不一样长?

论坛徽章:
0
4 [报告]
发表于 2007-06-21 17:39 |只看该作者
原帖由 cooljia 于 2007-6-21 17:00 发表
建议楼主把你的几张表table structure export出来, 作为附件.


表结构在这里



  1. --
  2. -- 表的结构 `ds_w_member`
  3. --

  4. CREATE TABLE ds_w_member (
  5.   s_id int(10) unsigned NOT NULL auto_increment,
  6.   s_passport varchar(255) NOT NULL,
  7.   s_password char(32) NOT NULL,
  8.   s_security_question varchar(255) NOT NULL,
  9.   s_security_answer varchar(255) NOT NULL,
  10.   s_nick_name varchar(255) NOT NULL,
  11.   s_status tinyint(3) unsigned NOT NULL,
  12.   s_passport_valid tinyint(3) unsigned NOT NULL,
  13.   s_identifying_code varchar(255) NOT NULL,
  14.   s_add_time int(10) unsigned NOT NULL,
  15.   PRIMARY KEY  (s_id),
  16.   KEY s_passport (s_passport)
  17. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  18. -- --------------------------------------------------------

  19. --
  20. -- 表的结构 `ds_w_member_information`
  21. --

  22. CREATE TABLE ds_w_member_information (
  23.   s_id int(10) unsigned NOT NULL auto_increment,
  24.   s_member_id int(10) unsigned NOT NULL,
  25.   s_face_image varchar(255) NOT NULL,
  26.   s_first_name varchar(255) NOT NULL,
  27.   s_last_name varchar(255) NOT NULL,
  28.   s_province int(10) unsigned NOT NULL,
  29.   s_city int(10) unsigned NOT NULL,
  30.   s_gender tinyint(3) unsigned NOT NULL,
  31.   s_birthday char(8) NOT NULL,
  32.   s_email varchar(255) NOT NULL,
  33.   s_phone_number varchar(255) NOT NULL,
  34.   s_mobile_number varchar(255) NOT NULL,
  35.   s_address_1 varchar(255) NOT NULL,
  36.   s_address_2 varchar(255) NOT NULL,
  37.   s_postcode varchar(255) NOT NULL,
  38.   s_connubiality tinyint(3) unsigned NOT NULL,
  39.   s_blood_group tinyint(3) unsigned NOT NULL,
  40.   s_interest_brand varchar(255) NOT NULL,
  41.   s_interest_style varchar(255) NOT NULL,
  42.   s_interest_book varchar(255) NOT NULL,
  43.   s_interest_music varchar(255) NOT NULL,
  44.   s_interest_movie varchar(255) NOT NULL,
  45.   s_certificate_type tinyint(3) unsigned NOT NULL,
  46.   s_certificate_code varchar(255) NOT NULL,
  47.   PRIMARY KEY  (s_id),
  48.   KEY s_member_id (s_member_id)
  49. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  50. -- --------------------------------------------------------

  51. --
  52. -- 表的结构 `ds_w_tags_topic`
  53. --

  54. CREATE TABLE ds_w_tags_topic (
  55.   s_id int(10) unsigned NOT NULL auto_increment,
  56.   s_tags_id int(10) unsigned NOT NULL,
  57.   s_title varchar(255) NOT NULL,
  58.   s_content longtext NOT NULL,
  59.   s_image_url varchar(255) NOT NULL,
  60.   s_member_id int(10) unsigned NOT NULL,
  61.   s_reply_amount int(10) unsigned NOT NULL,
  62.   s_read_amount int(10) unsigned NOT NULL,
  63.   s_status tinyint(3) unsigned NOT NULL,
  64.   s_reply_enabled tinyint(3) unsigned NOT NULL,
  65.   s_last_update int(10) unsigned NOT NULL,
  66.   s_add_ip varchar(15) NOT NULL,
  67.   s_add_time int(10) unsigned NOT NULL,
  68.   PRIMARY KEY  (s_id),
  69.   KEY s_member_id (s_member_id,s_add_time),
  70.   KEY s_status (s_status)
  71. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

复制代码


不会存在不一样长的情况~

论坛徽章:
0
5 [报告]
发表于 2007-06-21 17:57 |只看该作者
没有数据的情况, 再看看手册...

11.JPG (27.3 KB, 下载次数: 42)

11.JPG

论坛徽章:
0
6 [报告]
发表于 2007-06-21 18:26 |只看该作者
加上alter table ds_w_tags_topic add index i_tsl(s_tags_id, s_status, s_last_update);
于是order by也可以用索引鸟...~

论坛徽章:
0
7 [报告]
发表于 2007-06-21 20:22 |只看该作者
看看这句

  1. SELECT wm.s_id message_id,
  2.                                                 wm.s_member_id member_id,
  3.                                                 wm.s_from_member_id from_member_id,
  4.                                                 mm.s_nick_name from_member_nick_name,
  5.                                                 wm.s_title title,
  6.                                                 wm.s_is_read is_read,
  7.                                                 wm.s_is_reply is_reply,
  8.                                                 wm.s_add_time add_time
  9.                                         FROM ds_w_wardrobe_message wm,
  10.                                                 ds_w_member mm
  11.                                         WHERE wm.s_member_id=1
  12.                                                 AND mm.s_id=wm.s_from_member_id
  13.                                         ORDER BY wm.s_is_read ASC, wm.s_add_time DESC
复制代码


  1. --
  2. -- 表的结构 `ds_w_member`
  3. --

  4. CREATE TABLE ds_w_member (
  5.   s_id int(10) unsigned NOT NULL auto_increment,
  6.   s_passport varchar(255) NOT NULL,
  7.   s_password char(32) NOT NULL,
  8.   s_security_question varchar(255) NOT NULL,
  9.   s_security_answer varchar(255) NOT NULL,
  10.   s_nick_name varchar(255) NOT NULL,
  11.   s_status tinyint(3) unsigned NOT NULL,
  12.   s_passport_valid tinyint(3) unsigned NOT NULL,
  13.   s_identifying_code varchar(255) NOT NULL,
  14.   s_add_time int(10) unsigned NOT NULL,
  15.   PRIMARY KEY  (s_id),
  16.   KEY s_passport (s_passport)
  17. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  18. --
  19. -- 表的结构 `ds_w_wardrobe_message`
  20. --

  21. CREATE TABLE ds_w_wardrobe_message (
  22.   s_id int(10) unsigned NOT NULL auto_increment,
  23.   s_member_id int(10) unsigned NOT NULL,
  24.   s_from_member_id int(10) unsigned NOT NULL,
  25.   s_title varchar(255) NOT NULL,
  26.   s_message mediumtext NOT NULL,
  27.   s_is_read tinyint(3) unsigned NOT NULL,
  28.   s_is_reply tinyint(3) unsigned NOT NULL,
  29.   s_add_time int(10) unsigned NOT NULL,
  30.   PRIMARY KEY  (s_id),
  31.   KEY s_from_member_id (s_from_member_id),
  32.   KEY s_member_id (s_member_id)
  33. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制代码


结果看附件,也是执行的全表扫描,不用主键

id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
1 SIMPLE mm ALL PRIMARY NULL NULL NULL 2 Using temporary; Using filesort
1 SIMPLE wm ref s_from_member_id,s_member_id s_from_member_id 4 7looks.mm.s_id 1 Using where

没有整理,凑合看一下,mm表的possible_keys是PRIMARY但是 key是NULL

论坛徽章:
0
8 [报告]
发表于 2007-06-21 20:26 |只看该作者
原帖由 cooljia 于 2007-6-21 17:57 发表
没有数据的情况, 再看看手册...


我的结果怎么不合你的一样呢?

MySQL版本问题么? 我用的是 5.0.15
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP